记录编号 | 453541 | 评测结果 | AAAAAAAAAAAAAAAAAAAA | ||
---|---|---|---|---|---|
题目名称 | [POI 2000] 最长公共子串 | 最终得分 | 100 | ||
用户昵称 | 是否通过 | 通过 | |||
代码语言 | C++ | 运行时间 | 0.000 s | ||
提交时间 | 2017-09-21 17:18:06 | 内存使用 | 0.00 MiB | ||
#include <iostream> #include <cstring> #include <cstdio> using namespace std; char s[10020],ch[5][2010]; int pos[5],tmp[5]; char ran[5]={'@','#','$','%','^'}; int n,m,T,cnt; int t1[10020],t2[10020],t3[10020],buc[10020]; int sa[10020],rank[10020],height[10020]; int bl[10020]; inline void Suffix(){ int i,j,k(0),p(0),*x(t1),*y(t2),*t; for(i=0;i<=m;++i)buc[i]=0; for(i=1;i<=n;++i)++buc[x[i]=s[i]]; for(i=1;i<=m;++i)buc[i]+=buc[i-1]; for(i=n;i>=1;--i)sa[buc[x[i]]--]=i; for(j=1;p<n;j<<=1,m=p){ for(p=0,i=n-j+1;i<=n;++i)y[++p]=i; for(i=1;i<=n;++i) if(sa[i]>j) y[++p]=sa[i]-j; for(i=0;i<=m;++i)buc[i]=0; for(i=1;i<=n;++i)t3[i]=x[y[i]]; for(i=1;i<=n;++i)++buc[t3[i]]; for(i=1;i<=m;++i)buc[i]+=buc[i-1]; for(i=n;i>=1;--i)sa[buc[t3[i]]--]=y[i]; for(t=x,x=y,y=t,x[sa[1]]=1,p=1,i=2;i<=n;++i) x[sa[i]]=((y[sa[i]]==y[sa[i-1]])&&(y[sa[i]+j]==y[sa[i-1]+j]))?p:++p; } for(i=1;i<=n;++i)rank[sa[i]]=i; for(i=1;i<=n;height[rank[i++]]=k) for(k?k--:0,j=sa[rank[i]-1];s[i+k]==s[j+k];++k); } inline bool check(int len){ int i,j,k; bool flag[5]; for(i=1;i<=n;++i){ if(height[i]>=len){ for(j=i;height[j]>=len&&j<=n;++j); --j; memset(flag,0,sizeof(flag)); for(k=i-1;k<=j;++k) flag[bl[sa[k]]]=1; for(k=0;flag[k]&&k<T;++k); if(k==T) return true; i=j; } } return false; } inline int gg(){ freopen("pow.in","r",stdin); freopen("pow.out","w",stdout); scanf("%d",&T); for(int i=0;i<T;++i){ scanf("%s",ch[i]); tmp[i]=strlen(ch[i]); } for(int i=0;i<T;++i){ for(int j=0;j<tmp[i];++j){ s[++cnt]=ch[i][j]; bl[cnt]=i; } s[++cnt]=ran[i]; pos[i]=cnt; } n=strlen(s+1); m=130; Suffix(); 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; } printf("%d",ans); return 0; } int K(gg()); int main(){;}