程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ 3261 Milk Patterns 求可重疊的 k 次最長重復子串(後綴數組)

POJ 3261 Milk Patterns 求可重疊的 k 次最長重復子串(後綴數組)

編輯:C++入門知識

點擊打開鏈接 Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 9361 Accepted: 4218 Case Time Limit: 2000MS

Description

Farmer John has noticed that the quality of milk given by his cows varies from day to day. On further investigation, he discovered that although he can't predict the quality of milk from one day to the next, there are some regular patterns in the daily milk quality.

To perform a rigorous study, he has invented a complex classification scheme by which each milk sample is recorded as an integer between 0 and 1,000,000 inclusive, and has recorded data from a single cow over N (1 ≤ N≤ 20,000) days. He wishes to find the longest pattern of samples which repeats identically at least K (2 ≤ KN) times. This may include overlapping patterns -- 1 2 3 2 3 2 3 1 repeats 2 3 2 3 twice, for example.

Help Farmer John by finding the longest repeating subsequence in the sequence of samples. It is guaranteed that at least one subsequence is repeated at least K times.

Input

Line 1: Two space-separated integers: N and K
Lines 2..N+1: N integers, one per line, the quality of the milk on day i appears on the ith line.

Output

Line 1: One integer, the length of the longest pattern which occurs at least K times

Sample Input

8 2
1
2
3
2
3
2
3
1

Sample Output

4

Source

USACO 2006 December Gold 給定一個字符串,求至少出現 k 次的最長重復子串,這 k 個子串可以重疊。
跟POJ1743差不多,都用二分求解,只不過這道題二分求解的是最長長度,每判斷mid長度時,需要遍歷一下所有的height數組,看看有沒有最長公共前綴長度是mid而且數量大於k的,如果存在,則此mid滿足條件,繼續二分。
//4876K	172MS
#include
#include
#include
#define M 20007
#define MAX 1000010
using namespace std;
int sa[MAX],rank[MAX],height[MAX];
int wa[MAX],wb[MAX],wv[MAX],ws[MAX];
int num[MAX],s[MAX];
int cmp(int *r,int a,int b,int l)
{
    return r[a]==r[b]&&r[a+l]==r[b+l];
}
void get_sa(int *r,int n,int m)//求get函數
{
    int i,j,p,*x=wa,*y=wb,*t;
    for(i=0; i=0; i--)sa[--ws[x[i]]]=i;
    for(j=1,p=1; p=j)y[p++]=sa[i]-j;
        for(i=0; i=0; i--)sa[--ws[wv[i]]]=y[i];
        for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1; i


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved