给出几个由小写字母构成的单词,求它们最长的公共子串的长度。

任务

  • 从文件中读入单词
  • 计算最长公共子串的长度
  • 输出结果到文件

输入

文件的第一行是整数 n,1<=n<=5,表示单词的数量。接下来n行每行一个单词,只由小写字母组成,单词的长度至少为1,最大为2000。

输出:

仅一行,一个整数,最长公共子串的长度。

样例输入:

3
abcb
bca
acbc

样例输出:

2

题解:
显然所有的串先合并,然后用不同符号间隔
最后二分答案,找到high[i]大于答案x的 并不断往后扩展 如果满足所有子串都覆盖到即满足
为什么我总喜欢把 L开成char?
 #include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int N=;
int s[N],n=,k,tmp[N],sa[N],rk[N],high[N],color[N],m,l[];char S[][];
bool comp(int i,int j){
if(rk[i]!=rk[j])return rk[i]<rk[j];
int ri=i+k<=n?rk[i+k]:-;
int rj=j+k<=n?rk[j+k]:-;
return ri<rj;
}
void Getsa(){
for(int i=;i<=n;i++){
sa[i]=i;rk[i]=s[i];
}
for(k=;k<=n;k<<=){
sort(sa+,sa+n+,comp);
for(int i=;i<=n;i++)tmp[sa[i]]=tmp[sa[i-]]+comp(sa[i-],sa[i]);
for(int i=;i<=n;i++)rk[i]=tmp[i];
}
}
void Gethight(){
int j,h=;
for(int i=;i<=n;i++){
j=sa[rk[i]-];
if(h)h--;
for(;j+h<=n && i+h<=n;h++)if(s[i+h]!=s[j+h])break;
high[rk[i]-]=h;
}
}
void prework(int m){
int p=;
for(int i=;i<=m;i++){
for(int j=;j<=l[i];j++)
p++,color[p]=i;
p++;
}
}
bool d[];
bool check(int lim){
int p,ret;
for(int i=;i<n;i++){
if(high[i]>=lim){
p=i;
while(p<n && high[p+]>=lim)p++;p++;
for(int j=;j<=m;j++)d[j]=false;
for(int j=i;j<=p;j++)d[color[sa[j]]]=true;
ret=p;p=;
while(p<=m && d[p])p++;
if(p==m+)return true;
i=ret;
}
}
return false;
}
int main()
{
freopen("pow.in","r",stdin);
freopen("pow.out","w",stdout);
int r=2e8;
scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%s",S[i]);
l[i]=strlen(S[i]);
if(l[i]<r)r=l[i];
for(int j=;j<l[i];j++)s[++n]=S[i][j];
s[++n]=i;
}
Getsa();Gethight();prework(m);
int l=,mid,ans;
while(l<=r){
mid=(l+r)>>;
if(check(mid))ans=mid,l=mid+;
else r=mid-;
}
printf("%d\n",ans);
return ;
}

 

最新文章

  1. mysql查询本周、月、季度、年
  2. 通过docker-machine和etcd部署docker swarm集群
  3. web页面直接跳转至其他页面
  4. 关于android使用ksoap2报Caused by: java.lang.ClassCastException: org.ksoap2.SoapFault cannot be cast to org.ksoap2.serialization.SoapObject
  5. Ext TabPanel items高度宽度自适应
  6. Java基础之在窗口中绘图——显示曲线的控制点(CurveApplet 2 displaying control points)
  7. JavaScript 一些基础练习
  8. Session的获得方式
  9. hdu 5150 Sit sit sit
  10. POJ 3986 Math teacher&#39;s homework
  11. GoF 设计模式:浅浅印象
  12. Apache Struts2存在S2-045
  13. document.onkeydown
  14. No bean named &#39;xxxxx&#39; is defined异常,已解决,这个坑很难发现,你get了吗
  15. 梯度下降取负梯度的简单证明,挺有意思的mark一下
  16. 多态(upcast)减少分支判断 以及 多态继承设计、具体类型判断。
  17. maven多环境参数配置
  18. 前端 HTML body标签相关内容 常用标签 表单标签 form里面的 label标签介绍
  19. 网页title左边显示网页的logo图标
  20. vs2012\vs2013\vs2015碰到生成时报该错误:项目中不存在目标“GatherAllFilesToPublish”

热门文章

  1. codves 3044 矩形面积求并
  2. css3动画transition详解2
  3. 09_Python定义方法_Python编程之路
  4. Eclipse在线更新慢
  5. 新概念英语(1-51)A pleasant climate
  6. 模板引擎Jade详解
  7. 两款不同应用场景的Wpf分页控件
  8. python Django之文件上传
  9. Django Form组件 学生管理系统
  10. 05、NetCore2.0依赖注入(DI)之Web应用启动流程管理