Binary length k length greater than or equal to K is divided into a group of each group of SA maximum and minimum distance greater than K description feasible
#include <cstdio> #include <cstring> #include <algorithm>using namespace std;const int maxn = 20010;int S[maxn];int Sa[maxn];int T[MAXN], T2[MAXN], C[maxn];int RANK[MAXN], height[maxn];void build_sa (int m, int n) {int I, *x = t , *y = t2;for (i = 0; i < m; i++) c[i] = 0;for (i = 0; i < n; i++) C[x[i] = s[i]]++;for (i = 1; i < m; i++) c[i] + = C[i -1];for (i = n-1; I >= 0; i--) sa[--c[x[i]] = i;for (int k = 1; k <= N; k <<= 1) {int p = 0;for (i = n-k; I < n ; i++) y[p++] = i;for (i = 0; i < n; i++) if (Sa[i] >= k) y[p++] = Sa[i]-k;for (i = 0; i < m; i++) c[i] = 0;for (i = 0; i < n; i++) c[x[y[i]]]++;for (i = 0; i < m; i++) c[i]+= c[i-1];for (i = n-1; I >= 0; i--) sa[--c[x[y[i]]] = Y[i];swap (x, y);p = 1; X[sa[0]] = 0;for (i = 1; i < n; i++) x[sa[i]] = y[sa[i-1] [= Y[sa[i]] && y[sa[i-1]+k] = = Y[sa[i]+k]? P-1: P++;if (P >= N) break;m = p;}} void getheight (int n) {int k = 0;for (int i = 0; I <= N; i++) Rank[sa[i] = i;for (int i = 0; i < n; i++{if (k) K--;int j = sa[rank[i]-1];while (s[i+k] = = S[j+k]) k++;height[rank[i]] = k;}} bool OK (int n, int k) {int ans1 = sa[1], ans2 = sa[1];for (int i = 2; I <= n; i++) {if (Height[i] < k) {ans1 = Ans2 = sa[ I];} ELSE{ANS1 = Max (ans1, Sa[i]); ans2 = min (ans2, sa[i]); if (Ans1-ans2 > K) return true;}} return false;} int main () {int n;while (scanf ("%d", &n) && N) {for (int i = 0; i < n; i++) scanf ("%d", &s[i]); n--;for (int i = 0; I < n; i++) S[i] = s[i+1]-s[i] + 90;s[n] = 0;build_sa (+, n+1); GetHeight (n); int L = 4, r = n+1;int ans = -1;while (l <= r) {in T m = (l+r) >> 1;if (OK (n, m)) {L = M+1;ans = m;} Elser = m-1;} printf ("%d\n", ans+1);} return 0;}
POJ 1743 musical Theme suffix array non-overlapping longest repeating substring