还是直接上转移方程:

动规只能解决O(n^2)的最长公共子串问题

使用后缀数组或者SAM可以高效地解决这个问题

所以,对于这个问题,动规的代码就不给出了

直接给出SAM的实现,也为以后学习SAM打下一个基础

具体做法是,对一个串建后缀自动机,把另一个串在自动机上跑,维护一下最大的匹配的长度就好了

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,ans;
char s[];
struct Node
{
int siz,rt,last;
int fa[],maxl[];
int ch[][];
Node(){siz=rt=last=;}
int newnode(int x)
{
maxl[++siz]=x;
return siz;
}
void add(int x,int i)
{
int p=last,np=newnode(maxl[p]+);
while(p&&ch[p][i]==) ch[p][i]=np,p=fa[p];
if(p==) fa[np]=rt;
else
{
int q=ch[p][i];
if(maxl[q]==maxl[p]+) fa[np]=q;
else
{
int r=newnode(maxl[p]+);
memcpy(ch[r],ch[q],sizeof(ch[r]));
fa[r]=fa[q];
fa[q]=fa[np]=r;
while(p&&ch[p][i]==q)
ch[p][i]=r,p=fa[p];
}
}
last=np;
}
void solve()
{
int p=rt,len=;
for(int i=;i<=n;i++)
{
while(p&&ch[p][s[i]-'a']==)
p=fa[p],len=maxl[p];
if(p==) p=rt,len=;
else p=ch[p][s[i]-'a'],len++;
ans=max(ans,len);
}
}
}sam;
int main()
{
scanf("%s",s+);
n=strlen(s+);
for(int i=;i<=n;i++) sam.add(i,s[i]-'a');
scanf("%s",s+);
n=strlen(s+);
sam.solve();
printf("%d",ans);
return ;
}

我在敲的时候有一种不舒适的感觉,可能是SAM太强大了,日后赶紧学习一波

最新文章

  1. zw版【转发&#183;台湾nvp系列Delphi例程】HALCON HWindow Overlayer 1
  2. lintcode :最小路径和
  3. Emit
  4. 【linux】linux内核移植错误记录
  5. javascript倒置再次被否定作用
  6. 为什么我不愿意用ECharts
  7. typeHandler
  8. Python_内置函数之round的幺蛾子
  9. WPF触发器(Trigger) - DataTrigger
  10. Enterprise Integration Patterns
  11. SCU 4445 Right turn(dfs)题解
  12. Beta冲刺准备
  13. Matlab 随机数字
  14. Cookis与文件缓存的区别
  15. 关于ecshop的mobile里user.php登录和注册验证码不显示
  16. CASpringAnimation的使用
  17. Spring Boot实践——基础和常用配置
  18. 不错的Django博客
  19. 理解webpack4.splitChunks之maxAsyncRequests
  20. nginx结合fastcgi

热门文章

  1. 大数据培训班 cloudera公司讲师面对面授课 CCDH CCAH CCP
  2. Vue-router用法
  3. NB-IOT的键值对
  4. LINUX网络相关命令(转)
  5. Unity3d脚本生命周期
  6. spring 读取properties文件--通过注解方式
  7. 数据挖掘算法:DBSCAN算法的C++实现
  8. HTML如何给table添加滚动条
  9. 二分图最大权匹配:Kuhn-Munkres算法
  10. asp.net文件上传进度条研究