SA模板,然而48:
#include<bits/stdc++.h>
#define rank Rank
#define N 10005
using namespace std;
int T,n,m,a[N],id[N],SA[N],rank[N],tp[N],tax[N],Height[N],mins[N][15],lg[N],sum[150];
char str[N];
void RSort(){
for(int i=0;i<=m;i++) tax[i]=0;
for(int i=1;i<=n;i++) tax[rank[tp[i]]]++;
for(int i=1;i<=m;i++) tax[i]+=tax[i-1];
for(int i=n;i>=1;i--) SA[tax[rank[tp[i]]]--]=tp[i];
}
bool cmp(int *f,int x,int y,int w){return f[x]==f[y]&&f[x+w]==f[y+w];}
void Suffix(){
for(int i=1;i<=n;i++) rank[i]=a[i],tp[i]=i;
m=127;RSort();
int p=1;
for(int w=1;p<n;w<<=1,m=p){
int k=0;
for(int i=n-w+1;i<=n;i++) tp[++k]=i;
for(int i=1;i<=n;i++){if(SA[i]>w) tp[++k]=SA[i]-w;}
RSort();swap(tp,rank);rank[SA[1]]=p=1;
for(int i=2;i<=n;i++) rank[SA[i]]=cmp(tp,SA[i],SA[i-1],w)?p:++p;
}
p=0;
for(int i=1;i<=n;Height[rank[i++]]=p){
p=p?p-1:p;
for(int j=SA[rank[i]-1];a[i+p]==a[j+p];p++);
}
}
void ST(){
for(int i=1;i<=n;i++) mins[i][0]=Height[i];
for(int j=1;(1<<j)<=n;j++){
for(int i=1;i+(1<<j)-1<=n;i++) mins[i][j]=min(mins[i][j-1],mins[i+(1<<j-1)][j-1]);
}
}
int lcp(int a,int b){
a++;
return min(mins[a][lg[b-a+1]],mins[b-(1<<lg[b-a+1])+1][lg[b-a+1]]);
}
int work(){
int l=1,ans=0,cnt=0;
for(int i=1;i<=n;i++){
if(id[SA[i]]==100) continue;
if(!sum[id[SA[i]]]) cnt++;
sum[id[SA[i]]]++;
while(id[SA[l]]==100||sum[id[SA[l]]]>1) sum[id[SA[l++]]]--;
if(cnt==T) ans=max(ans,lcp(l,i));
}
return ans;
}
int main(){
lg[0]=-1;
for(int i=1;i<=n;i++) lg[i]=lg[i>>1]+1;
scanf("%d",&T);
int k=123;
for(int t=1;t<=T;t++){
scanf("%s",str);
int len=strlen(str);
for(int i=0;i<len;i++) a[++n]=str[i],id[n]=k;
a[++n]=k++;id[n]=100;
}
Suffix();
ST();
printf("%d",work());
return 0;
}