#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define N 20005
#define inf 0x3f3f3f3f
using namespace std;
int n,m,p,w,i,a[N],tax[N],rank[N],tp[N],SA[N],height[N],k,j,num[N];
bool cmp(int *f,int x,int y,int w){return f[x]==f[y]&&f[x+w]==f[y+w];}
void Rsort(){
for(i=0;i<=m;i++) tax[i]=0;
for(i=1;i<=n;i++) tax[rank[tp[i]]]++;
for(i=1;i<=m;i++) tax[i]+=tax[i-1];
for(i=n;i>=1;i--) SA[tax[rank[tp[i]]]--]=tp[i];
}
void init(){
for(i=1;i<=n;i++)
scanf("%d",&num[i]);
for(i=1;i<=n-1;i++)
a[i]=num[i+1]-num[i]+89;
n--;
}
void sa(){
for(i=1;i<=n;i++)rank[i]=a[i],tp[i]=i;
m=300;Rsort();
for(p=w=1;p<n;m=p,w+=w){
for(p=0,i=n-w+1;i<=n;i++)tp[++p]=i;
for(i=1;i<=n;i++) if(SA[i]>w) tp[++p]=SA[i]-w;
Rsort(); swap(rank,tp); rank[SA[1]]=p=1;
for(i=2;i<=n;i++) rank[SA[i]]=cmp(tp,SA[i],SA[i-1],w)?p:++p;
}
for(i=1,k=0;i<=n;height[rank[i++]]=k)
for(k=k?k-1:k,j=SA[rank[i]-1];a[i+k]==a[j+k];k++);
}
bool check(int mid){
int maxx=SA[1],minn=SA[1];
for(int i=2;i<=n;i++){
int x=height[i];
if(x<mid){
if(maxx-minn>mid)return true;
maxx=SA[i],minn=SA[i];
}else{
maxx=max(maxx,SA[i]);
minn=min(minn,SA[i]);
}
}
if(maxx-minn>=mid)return true;
return false;
}
int main(){
while(~scanf("%d",&n)){
if(!n)break;
init();
sa();
int l=0,r=n,ans=0;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid))ans=mid,l=mid+1;
else r=mid-1;
}
ans++;
printf("%d\n",ans<5?0:ans);
}
}
poj 1743 后缀数组+二分答案
最新推荐文章于 2021-07-19 11:08:42 发布