3160 最长公共子串

题目描述 Description

给出两个由小写字母组成的字符串,求它们的最长公共子串的长度。

输入描述 Input Description

读入两个字符串

输出描述 Output Description

输出最长公共子串的长度

样例输入(Sample Input)

yeshowmuchiloveyoumydearmotherreallyicannotbelieveit

yeaphowmuchiloveyoumydearmother

样例输出(Sample Output)

27

数据范围及提示

单个字符串的长度不超过100000

后缀自动机模版题,先以第一个串建立一个后缀自动机,第二个串直接匹配

#include<queue>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define ll long long
#define inf 300
#define mod 1000000007
using namespace std;
int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
const int N=100005;
const int sigma=27;
int n;
char ch[N<<1];
struct sam{
int cnt,last;
int fa[N<<1],a[N<<1][sigma],mx[N<<1],len[N<<1];
sam(){
last=++cnt;
}
void extend(int c){
int p=last,np=last=++cnt;mx[np]=mx[p]+1;
while(!a[p][c]&&p)a[p][c]=np,p=fa[p];
if(!p)fa[np]=1;
else
{
int q=a[p][c];
if(mx[p]+1==mx[q])fa[np]=q;
else
{
int nq=++cnt;mx[nq]=mx[p]+1;
memcpy(a[nq],a[q],sizeof(a[q]));
fa[nq]=fa[q];
fa[np]=fa[q]=nq;
while(a[p][c]==q)a[p][c]=nq,p=fa[p];
}
}
}
void solve(){
scanf("%s",ch+1);
memset(len,0,sizeof(len));
int l=strlen(ch+1),p=1,tmp=0,ans=0;
for(int i=1;i<=l;i++)
{
int c=ch[i]-'a';
while(!a[p][c]&&p)p=fa[p];
if(p==0)p=1,tmp=0;
else tmp=min(tmp,mx[p])+1,p=a[p][c];
ans=max(ans,tmp);
}
printf("%d\n",ans);
}
}sam;
int main()
{
while(~scanf("%s",ch+1))
{
int n=strlen(ch+1);
for(int i=1;i<=n;i++) sam.extend(ch[i]-'a');
sam.solve();
}
return 0;
}

最新文章

  1. 转载--改变ubuntu默认编码为GBK
  2. 在Thinkphp3.2.3框架下实现自动获取客户端IP地址的get_client_ip()函数
  3. SAX与DOM
  4. 一个Java复制目录的方法(递归)
  5. Ubuntu FTP 配置
  6. iOS7 隐藏状态栏 hide statusBar
  7. CentOS中查看物理CPU信息的方法
  8. 再也不要说,jquery动画呆板了
  9. 在SQL Server 2014下面使用的SQL2000的Northwind和Pubs示例数据库
  10. Mysql shell 控制台---mysqlsh
  11. Qt零基础教程(四) QWidget详解篇
  12. BZOJ1132: [POI2008]Tro
  13. maven项目打包发布时跳过测试
  14. Ubuntu 16.04 LTS安装 TeamViewer
  15. jsp 使用Common-FileUpload组件文件上传及限制上传类型
  16. Odoo 中使用 celery 实现高性能异步任务队列
  17. Node_初步了解(2)
  18. 等比数列二分求和(logn复杂度)
  19. 第四章&#160;栈与队列(c4)栈应用:中缀表达式求值
  20. sed: 1: “…”: invalid command code on Mac OS

热门文章

  1. 《白书》上线段树RMQ的实现
  2. hihoOffer收割练习20题目2
  3. Android推送服务(1)几种实现方式
  4. Tcpdump的用法
  5. java 缓冲流 Buffer
  6. 置换测试: Mock, Stub 和其他
  7. Elasticsearch--集群&amp;吞吐量
  8. Hadoop YARN学习之Hadoop框架演进历史简述
  9. SQL优化基础 使用索引(一个小例子)
  10. 提高SQL查询效率 的10大方法