| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
把s数组清空了就A了……#include<iostream>
#include<cstdio>
#include<cstring>
#define clr(a,b) memset(a,b,sizeof(a))
#define maxl 21000
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
int sa[maxl+10],t1[maxl+10],t2[maxl+10],c[maxl+10],s[maxl+10],pos[maxl+10];
char buf[110];
void buildsa(int n,int m){
s[n]=0;
int i,p=1,*x=t1,*y=t2;
for(i=0;i<m;i++)c[i]=0;
for(i=0;i<n;i++)c[x[i]=s[i]]++;
for(i=1;i<m;i++)c[i]+=c[i-1];
for(i=n-1;~i;i--)sa[--c[x[i]]]=i;
for(int k=1;p<n;k<<=1,m=p){
for(p=0,i=n-k;i<n;i++)y[p++]=i;
for(i=0;i<n;i++)if(sa[i]>=k)y[p++]=sa[i]-k;
for(i=0;i<m;i++)c[i]=0;
for(i=0;i<n;i++)c[x[y[i]]]++;
for(i=1;i<m;i++)c[i]+=c[i-1];
for(i=n-1;~i;i--)sa[--c[x[y[i]]]]=y[i];
swap(x,y);
x[sa[0]]=0;p=1;
for(i=1;i<n;i++)x[sa[i]]=y[sa[i]]==y[sa[i-1]]&&y[sa[i]+k]==y[sa[i-1]+k]?p-1:p++;
}
}
int ra[maxl+10],hei[maxl+10];
void buildhei(int n){
int i,j,k=0;
for(i=0;i<=n;i++)ra[sa[i]]=i;
for(i=0;i<n;hei[ra[i++]]=k)
for(k-=k>0,j=sa[ra[i]-1];s[i+k]==s[j+k];k++);
}
int vis[maxl+10];
bool judge(int x,int n,int len){
int cur=1,cnt=0;
clr(vis,-1);
for(int i=0;i<=len;i++){
if(hei[i]<x){
cnt=0;
cur=i+1;
}else{
if(vis[pos[sa[i]]]!=cur){
vis[pos[sa[i]]]=cur;
cnt++;
}
if(vis[pos[sa[i-1]]]!=cur){
vis[pos[sa[i-1]]]=cur;
cnt++;
}
if(cnt==n)return 1;
}
}
return 0;
}
int main(){
freopen("1226.in","r",stdin);
int T;
scanf("%d",&T);
while(T--){
clr(pos,0);
int tot=0,n,r=200;
scanf("%d",&n);
if(n==1){
scanf("%s",buf);
printf("%d\n",strlen(buf));
continue;
}
clr(s,0);//就是这里……不明觉厉
for(int i=1;i<=n;i++){
scanf("%s",buf);
int len=strlen(buf);
r=min(r,len);
for(int j=0;j<len;j++)pos[tot]=i,s[tot++]=buf[j];
pos[tot]=i;
s[tot++]=i*2+150;
for(int j=len-1;~j;j--)pos[tot]=i,s[tot++]=buf[j];
pos[tot]=i;
s[tot++]=i*2+151;
}
buildsa(tot+1,360);
buildhei(tot);
if(!judge(1,n,tot))puts("0");
else{
int l=1,ans;
while(l<=r){
int m=(l+r)/2;
if(judge(m,n,tot))l=m+1,ans=m;
else r=m-1;
}
printf("%d\n",ans);
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator