男人8题,又改了一次板子
//最长不重叠重复子串
#include <cstdio>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long LL;
typedef int lint;
const lint maxn = 20000 + 10;
const lint inf = 0x3f3f3f3f;
struct suffix{
lint c[maxn],sa[maxn],t1[maxn],t2[maxn],m,n,h[maxn],height[maxn],rk[maxn],s[maxn];
void Build_SA(lint len){
m = 0;
lint* x = t1,*y = t2;
n = len;
for( lint i = 0;i < n;i++ ) m = max( m,s[i] );
for( lint i = 0;i <= m;i++ ) c[i] = 0;
for( lint i = 0;i < n;i++ ) c[ x[i] = s[i] ]++;
for( lint i = 1;i <= m;i++ ) c[i] += c[i-1];
for( lint i = n-1;i >= 0;i-- ) {
sa[ --c[ x[i] ] ] = i;
}
for( lint k = 1;k < n;k <<= 1 ){
lint cnt = 0;
for( lint i = n - 1;i >= n-k;i-- ) y[cnt++] = i;
for( lint i = 0;i < n;i++ ) if( sa[i] >= k ) y[cnt++] = sa[i]-k;
for( lint i = 0;i <= m;i++ ) c[i] = 0;
for( lint i = 0;i < n;i++ ) c[ x[i] ]++;
for( lint i = 1;i <= m;i++ ) c[i] += c[i-1];
for( lint i = cnt-1;i >= 0;i-- ) sa[ --c[ x[ y[i] ] ] ] = y[i];
swap( x,y );
lint num = 0;
x[ sa[0] ] = 0;
for( lint i = 1;i < n;i++ ){
if( y[ sa[i-1] ] != y[ sa[i] ] || y[ sa[i-1]+k ] != y[ sa[i]+k ] ){
x[ sa[i] ] = ++num;
}else{
x[ sa[i] ] = num;
}
}
if( num == n-1 ) return;
m = num;
}
}
void getheight(){
for( lint i = 0;i < n;i++ ){
rk[ sa[i] ] = i;
}
lint cnt = 1;
h[ sa[0] ] = 0;
height[ 0 ] = 0;
for( lint i = 0;i < n;i++ ){
if(cnt)cnt--;
while( rk[i] >= 1 &&sa[rk[i]-1]+cnt && i+cnt < n&& s[ sa[rk[i]-1]+cnt ] == s[ i+cnt ] ) cnt++;
h[ i ] = cnt;
height[ rk[i] ] = cnt;
}
//cout << "debug" << endl;
}
}g;
lint a[maxn],n;
bool judge( lint x ){
lint mn = g.sa[0],mm = g.sa[0];
for( lint i = 1;i < n;i++ ){
if( g.height[i] < x ){
mn = inf;
mm = 0;
}
mm = max( mm,g.sa[i] );
mn = min( mn,g.sa[i] );
if( mm-mn >= x+1 ) return true;
}
return false;
}
lint solve(){
lint l = 0,r = n+10;
while( l != r-1 ){
lint mid = l + (r - l >> 1);
if( judge( mid ) ){
l = mid;
}else{
r = mid;
}
}
return l;
}
int main()
{
while( scanf("%d",&n) == 1 && n ){
for( lint i = 0;i < n;i++ ) {
scanf("%d",&a[i]);
if(i)
g.s[i-1] = a[i] - a[i-1]+88;
}
n--;
//g.s[ n ] = 0;
g.Build_SA(n);
g.getheight();
lint ans = solve()+1;
if( ans >= 5 )
printf("%d\n",ans);
else printf("0\n");
}
return 0;
}