1 #include<cstdio> 2 #include<algorithm> 3 #define INF 0x7FFFFFFF 4 #define MAXN 20010 5 using namespace std; 6 int a[MAXN]; 7 int wa[MAXN],wb[MAXN],sa[MAXN],wv[MAXN],ws[MAXN]; 8 int height[MAXN],Rank[MAXN]; 9 inline bool cmp(int *r,int a,int b,int len) 10 { 11 return r[a]==r[b]&&r[a+len]==r[b+len]; 12 } 13 void SA(int n,int m) 14 { 15 int i,j,p,*x=wa,*y=wb,*t; 16 for(i=0;i<m;i++) 17 ws[i]=0; 18 for(i=0;i<n;i++) 19 ws[x[i]=a[i]]++; 20 for(i=1;i<m;i++) 21 ws[i]+=ws[i-1]; 22 for(i=n-1;i>=0;i--) 23 sa[--ws[x[i]]]=i; 24 for(j=p=1;p<n;j<<=1,m=p) 25 { 26 for(p=0,i=n-j;i<n;i++) 27 y[p++]=i; 28 for(i=0;i<n;i++) 29 { 30 if(sa[i]>=j) 31 y[p++]=sa[i]-j; 32 } 33 for(i=0;i<m;i++) 34 ws[i]=0; 35 for(i=0;i<n;i++) 36 ws[wv[i]=x[y[i]]]++; 37 for(i=1;i<m;i++) 38 ws[i]+=ws[i-1]; 39 for(i=n-1;i>=0;i--) 40 sa[--ws[wv[i]]]=y[i]; 41 for(t=x,x=y,y=t,x[sa[0]]=0,p=i=1;i<n;i++) 42 x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; 43 } 44 } 45 void Height(int n) 46 { 47 int i,j,k; 48 for(i=1;i<=n;i++) 49 Rank[sa[i]]=i; 50 for(i=k=0;i<n;height[Rank[i++]]=k) 51 for(k?k--:0,j=sa[Rank[i]-1];a[i+k]==a[j+k];k++); 52 } 53 bool OK(int n,int len) 54 { 55 int i,up,down; 56 up=down=sa[1]; 57 for(i=2;i<=n;i++) 58 { 59 if(height[i]<len) 60 up=down=sa[i]; 61 else 62 { 63 up=max(up,sa[i]); 64 down=min(down,sa[i]); 65 if(up-down>=len) 66 return true; 67 } 68 } 69 return false; 70 } 71 int main() 72 { 73 int n,i,low,high,mid; 74 while(scanf("%d",&n),n) 75 { 76 for(i=0;i<n;i++) 77 scanf("%d",&a[i]); 78 for(i=0;i<n-1;i++) 79 a[i]=a[i+1]-a[i]+88; 80 a[n-1]=0; 81 SA(n,177); 82 Height(n-1); 83 for(low=4,high=n>>1|1;low<high;) 84 { 85 mid=(low+high)>>1; 86 if(OK(n,mid)) 87 low=mid+1; 88 else 89 high=mid; 90 } 91 if(low<5) 92 low=0; 93 printf("%d\n",low); 94 } 95 return 0; 96 }