Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 22324 | Accepted: 7600 |
Description
Input
Output
Sample Input
30 25 27 30 34 39 45 52 60 69 79 69 60 52 45 39 34 30 26 22 18 82 78 74 70 66 67 64 60 65 80 0
Sample Output
5
Hint
#include <map> #include <set> #include <stack> #include <queue> #include <cmath> #include <ctime> #include <vector> #include <cstdio> #include <cctype> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; #define INF 0x3f3f3f3f #define inf -0x3f3f3f3f #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define mem0(a) memset(a,0,sizeof(a)) #define mem1(a) memset(a,-1,sizeof(a)) #define mem(a, b) memset(a, b, sizeof(a)) typedef long long ll; const int maxn=20000+100; int s[maxn]; int sa[maxn],t[maxn],t2[maxn],c[maxn]; int n; void build_sa(int m){ int i,*x=t,*y=t2; //基数排序 for(int i=0;i<m;i++) c[i]=0; for(int i=0;i<n;i++) c[x[i]=s[i]]++; for(int i=1;i<m;i++) c[i]+=c[i-1]; for(int i=n-1;i>=0;i--) sa[--c[x[i]]]=i; for(int k=1;k<=n;k<<=1){ int p=0; for(int i=n-k;i<n;i++) y[p++]=i; for(int i=0;i<n;i++) if(sa[i]>=k) y[p++]=sa[i]-k; for(int i=0;i<m;i++) c[i]=0; for(int i=0;i<n;i++) c[x[y[i]]]++; for(int i=0;i<m;i++) c[i]+=c[i-1]; for(int i=n-1;i>=0;i--) sa[--c[x[y[i]]]]=y[i]; swap(x,y); p=1;x[sa[0]]=0; for(int 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; } } int rank1[maxn],height[maxn]; void getHeight(){ int i,j,k=0; for(int i=0;i<=n;i++) rank1[sa[i]]=i; for(int i=0;i<n;i++){ if(k) k--; j=sa[rank1[i]-1]; while(s[i+k]==s[j+k]) k++; height[rank1[i]]=k; } } bool check(int k){ int minv,maxv; minv=INF; maxv=-INF; for(int i=2;i<=n;i++){ //rank1为0的已经被抛弃 if(height[i]>=k){ minv=min(minv,sa[i-1]); minv=min(minv,sa[i]); maxv=max(maxv,sa[i-1]); maxv=max(maxv,sa[i]); if(maxv-minv>=k) return true; continue; } else{ minv=INF; maxv=-INF; } } return false; } int main(){ while(scanf("%d",&n)!=EOF){ if(n==0) break; for(int i=0;i<n;i++){ scanf("%d",&s[i]); if(i!=0) s[i-1]=s[i]-s[i-1]+100; } s[n-1]=0; build_sa(200); n--; getHeight(); int low=3,high=n; while(high-low>=0){ int mid=(low+high)/2; if(check(mid)) low=mid+1; else high=mid-1; } if(low<=3) printf("0\n"); else printf("%d\n",low); } return 0; }