给出几个由小写字母构成的单词,求它们最长的公共子串的长度。
任务
- 从文件中读入单词
- 计算最长公共子串的长度
- 输出结果到文件
输入
文件的第一行是整数 n,1<=n<=5,表示单词的数量。接下来n行每行一个单词,只由小写字母组成,单词的长度至少为1,最大为2000。
输出:
仅一行,一个整数,最长公共子串的长度。
样例输入:
3abcbbcaacbc
样例输出:
2 题解: 显然所有的串先合并,然后用不同符号间隔 最后二分答案,找到high[i]大于答案x的 并不断往后扩展 如果满足所有子串都覆盖到即满足 为什么我总喜欢把 L开成char?
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 const int N=20005; 9 int s[N],n=0,k,tmp[N],sa[N],rk[N],high[N],color[N],m,l[6];char S[6][2005];10 bool comp(int i,int j){11 if(rk[i]!=rk[j])return rk[i] =lim){48 p=i;49 while(p =lim)p++;p++;50 for(int j=1;j<=m;j++)d[j]=false;51 for(int j=i;j<=p;j++)d[color[sa[j]]]=true;52 ret=p;p=1;53 while(p<=m && d[p])p++;54 if(p==m+1)return true;55 i=ret;56 }57 }58 return false;59 }60 int main()61 {62 freopen("pow.in","r",stdin);63 freopen("pow.out","w",stdout);64 int r=2e8;65 scanf("%d",&m);66 for(int i=1;i<=m;i++){67 scanf("%s",S[i]);68 l[i]=strlen(S[i]);69 if(l[i] >1;77 if(check(mid))ans=mid,l=mid+1;78 else r=mid-1;79 }80 printf("%d\n",ans);81 return 0;82 }