http://poj.org/problem?id=3261
Test instructions: A string of length n, which requires the length of the longest substring and the number of occurrences of this substring not less than k times. (1<=n<=20000, 2<=k<=n)
#include <cstdio> #include <algorithm>using namespace std;const int n=20015;void sort (int *x, int *y, int *sa, int n, int m) {static int c[n], i;for (i=0; i<m; ++i) c[i]=0;for (i=0; i<n; ++i) c[x[y[i]]]++;for (i=1; i<m; ++i) c[ I]+=c[i-1];for (i=n-1; i>=0;-I.) sa[--c[x[y[i]]]]=y[i];} void Hz (int *r, int *sa, int n, int m) {static int t1[n], t2[n];static int *x, *y, *t, J, I, P=0;x=t1; Y=t2;for (i=0; i< N ++i) X[i]=r[i], Y[i]=i;sort (x, y, SA, N, m); for (J=1, p=1; p<n; j<<=1, m=p) {p=0;for (i=n-j; i<n; ++i) y[p++]=i; for (i=0; i<n; ++i) if (sa[i]-j>=0) y[p++]=sa[i]-j;sort (x, y, SA, N, m); for (T=x, X=y, Y=t, x[sa[0]]=0, P=1, I=1; i< N ++i) x[sa[i]]=y[sa[i]]==y[sa[i-1]]&&y[sa[i]+j]==y[sa[i-1]+j]?p-1:p++;}} void Geth (int *a, int *sa, int *rank, int *h, int n) {static int k, I, J; k=0;for (I=1; i<=n; ++i) rank[sa[i]]=i;for (i=1 ; i<=n; H[rank[i++]]=k) for (k?--k:0, j=sa[rank[i]-1]; a[i+k]==a[j+k]; ++k);} const int Oo=~0u>>2;int sa[n], rank[n], H[n], N, A[n], b[n], k;bool check (int K) {int cnt=1;for (int i=2; i<=n; ++i) {if (h[i]>=k) {++cnt;if (cnt>=k) return 1;} else cnt=1;} if (cnt>=k) return 1;return 0;} int Mp[1000005];int Main () {scanf ("%d%d", &n, &k), for (int i=1; i<=n; ++i) scanf ("%d", &a[i]), B[i]=a[i];so RT (B+1, b+1+n); int Tot=unique (b+1, b+1+n)-b-1;for (int i=1; i<=tot; ++i) mp[b[i]]=i;for (int i=1; i<=n; ++i) a[i]=mp[ A[i]];hz (A, SA, n+1, $), Geth (A, SA, rank, h, N), int mid, l=0, R=n;while (l<=r) {mid= (l+r) >>1;if (check (mid)) L=mi D+1;else r=mid-1;} printf ("%d\n", l-1); return 0;}
Classic question ... Also the group height ... Divide the height >= two points in a group, and then determine if there is a greater than or equal to K elements
"POJ" 3261 Milk Patterns