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 ≤ K ≤ N) 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 Ktimes.
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
题意
对一个长度为n的数字串,求重复出现了至少 K 次的串的最大长度,二分查找满足条件的最大长度m,充分利用height特性,看是否有大于k个字串满足相同前缀长度大于m,累加的时候要height值连续大于,这样才能保证前缀相同,否则计数器清零。
AC代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#include<string>
#include<map>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)
#define fori(x) for(int i=0;i<x;i++)
#define forj(x) for(int j=0;j<x;j++)
#define memset(x,y) memset(x,y,sizeof(x))
#define memcpy(x,y) memcpy(x,y,sizeof(y))
#define sca(x) scanf("%d", &x)
#define scas(x) scanf("%s",x)
#define sca2(x,y) scanf("%d%d",&x,&y)
#define sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define scl(x) scanf("%lld",&x)
#define scl2(x,y) scanf("%lld%lld",&x,&y)
#define scl3(x,y,z) scanf("%lld%lld%lld",&x,&y,&z)
#define pri(x) printf("%d\n",x)
#define pri2(x,y) printf("%d %d\n",x,y)
#define pris(x) printf("%s\n",x)
#define prl(x) printf("%lld\n",x)
typedef long long ll;
const int maxn=1e6+7;
const int mod=1e9+7;
const double eps=1e-8;
using namespace std;
const int N = 20000 + 10, INF = 0x3f3f3f3f;
int sa[N], height[N], rnk[N], c[N], wa[N], wb[N];
bool cmp(int *r, int a, int b, int l)
{
return r[a] == r[b] && r[a+l] == r[b+l];
}
void Rsort(int *x, int *y, int n, int m)
{
for(int i = 0; i < m; i++) c[i] = 0;
for(int i = 0; i < n; i++) c[x[y[i]]]++;
for(int i = 1; i < m; i++) c[i] += c[i-1];
for(int i = n-1; i >= 0; i--) sa[--c[x[y[i]]]] = y[i];
}
void da(int *s, int n, int m)
{
int *x = wa, *y = wb;
for(int i = 0; i < n; i++) x[i] = s[i], y[i] = i;
Rsort(x, y, n, m);
for(int j = 1, p = 1; p < n; j *= 2, m = p)
{
p = 0;
for(int i = n-j; i < n; i++) y[p++] = i;
for(int i = 0; i < n; i++) if(sa[i] >= j) y[p++] = sa[i] - j;
Rsort(x, y, n, m);
swap(x, y);
p = 1; x[sa[0]] = 0;
for(int i = 1; i < n; i++) x[sa[i]] = cmp(y, sa[i-1], sa[i], j) ? p-1 : p++;
}
}
void get_height(int *s, int n)
{
int i, j, k = 0;
for(i = 0; i <= n; i++) rnk[sa[i]] = i;
for(i = 0; i < n; height[rnk[i++]] = k)
for(k ? --k : 0, j = sa[rnk[i]-1]; s[i+k] == s[j+k]; k++);
}
int n;
int a[maxn];
int k;
bool check(int m)
{
int cnt = 0;
rep(i,2,n+1)
{
if(height[i] < m)
{
cnt = 0;
continue;
}
cnt++;
if(cnt + 1 >= k)
return true;
}
return false;
}
int main()
{
sca2(n,k);
int ma = -1;
rep(i,0,n)
{
sca(a[i]);
ma = max(ma,a[i]);
}
a[n] = 0;
da(a,n+1,ma+5);
get_height(a,n);
int l = 0,r = n,res = 0;
int mid;
while(l<=r)
{
mid = (l+r)/2;
if(check(mid))
{
res = mid;
l = mid + 1;
}
else
{
r = mid - 1;
}
}
pri(res);
return 0;
}