1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib>
namespace POJ1743 { using namespace std;
# define N 20020
int sk[N], rk[N], sa[N], sb[N], ht[N]; int acc[N];
int n, m, nn; int a[N]; int b[N];
void radix_sort() { int i; for (i = 0; i < m; i++) acc[i] = 0; for (i = 0; i < n; i++) acc[sk[i]]++; for (i = 1; i < m; i++) acc[i] += acc[i - 1]; for (i = n - 1; i >= 0; i--) sa[--acc[sk[sb[i]]]] = sb[i]; }
bool cmp(int *f, int x, int y, int w) { return f[x] == f[y] && f[x + w] == f[y + w]; }
void suffix_array(int *a) { for (int i = 0; i < n; i++) { sk[i] = a[i]; sb[i] = i; } radix_sort(); for (int w = 1, p = 1, i; p < n; w <<= 1, m = p) { for (p = 0, i = n - w; i < n; i++) sb[p++] = i; for (i = 0; i < n; i++) if (sa[i] >= w) sb[p++] = sa[i] - w; radix_sort(); for (i = 0; i < n; i++) sb[i] = sk[i]; p = 0; sk[sa[0]] = p++; for (i = 1; i < n; i++) sk[sa[i]] = cmp(sb, sa[i], sa[i - 1], w) ? p - 1 : p++; } }
void get_ht() { int i, j, k = 0; for (i = 1; i <= nn; i++) rk[sa[i]] = i; for (i = 0; i < nn; ht[rk[i++]] = k) for (k ? k-- : 0, j = sa[rk[i] - 1]; b[i + k] == b[j + k]; k++); }
bool check(int x) { int mx = sa[1], mn = sa[1]; for (int i = 2; i < nn; i++) { if (ht[i] < x) mx = mn = sa[i]; else { mx = max(mx, sa[i]); mn = min(mn, sa[i]); if (mx - mn >= x) return true; } } return false; }
void solve() { while (scanf("%d", &nn), nn) { for (int i = 0; i < nn; i++) { scanf("%d", &a[i]); } nn -= 1; for (int i = 0; i < nn; i++) { b[i] = a[i] - a[i + 1] + 88; } m = 190; n = nn + 1; b[n - 1] = 0; suffix_array(b); get_ht();
int ans = 0; int l = 4, r = nn / 2 + 1, mid; while (l <= r) { mid = (l + r) >> 1; if (check(mid)) ans = mid, l = mid + 1; else r = mid - 1; } if (ans < 4) puts("0"); else printf("%d\n", ans + 1); } } }
int main() { POJ1743::solve(); return 0; }
|