动态规划&字符串:最长公共子串
还是直接上转移方程:

动规只能解决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太强大了,日后赶紧学习一波
动态规划&字符串:最长公共子串的更多相关文章
- 利用后缀数组(suffix array)求最长公共子串(longest common substring)
摘要:本文讨论了最长公共子串的的相关算法的时间复杂度,然后在后缀数组的基础上提出了一个时间复杂度为o(n^2*logn),空间复杂度为o(n)的算法.该算法虽然不及动态规划和后缀树算法的复杂度低,但其 ...
- 动态规划(一)——最长公共子序列和最长公共子串
注: 最长公共子序列采用动态规划解决,由于子问题重叠,故采用数组缓存结果,保存最佳取值方向.输出结果时,则自顶向下建立二叉树,自底向上输出,则这过程中没有分叉路,结果唯一. 最长公共子串采用参考串方式 ...
- 《算法导论》读书笔记之动态规划—最长公共子序列 & 最长公共子串(LCS)
From:http://my.oschina.net/leejun2005/blog/117167 1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要 ...
- 动态规划经典——最长公共子序列问题 (LCS)和最长公共子串问题
一.最长公共子序列问题(LCS问题) 给定两个字符串A和B,长度分别为m和n,要求找出它们最长的公共子序列,并返回其长度.例如: A = "HelloWorld" B = & ...
- 动态规划——最长公共子序列&&最长公共子串
最长公共子序列(LCS)是一类典型的动归问题. 问题 给定两个序列(整数序列或者字符串)A和B,序列的子序列定义为从序列中按照索引单调增加的顺序取出若干个元素得到的新的序列,比如从序列A中取出 A ...
- 动态规划1——最长递增子序列、最长公共子序列、最长公共子串(python实现)
目录 1. 最长递增序列 2. 最长公共子序列 3. 最长公共子串 1. 最长递增序列 给定一个序列,找出其中最长的,严格递增的子序列的长度(不要求连续). 解法一:动态规划 通过一个辅助数组记录每一 ...
- [Python]最长公共子序列 VS 最长公共子串[动态规划]
前言 由于原微软开源的基于古老的perl语言的Rouge依赖环境实在难以搭建,遂跟着Rouge论文的描述自行实现. Rouge存在N.L.S.W.SU等几大子评估指标.在复现Rouge-L的函数时,便 ...
- 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774
Long Long Message Problem's Link:http://poj.org/problem?id=2774 Mean: 求两个字符串的最长公共子串的长度. analyse: 前面在 ...
- poj 2774 后缀数组 两个字符串的最长公共子串
Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 31904 Accepted: 12 ...
随机推荐
- 炒鸡简单的javaScript的call和apply方法
解释一 作者:杨志 链接:https://www.zhihu.com/question/20289071/answer/14644278 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商 ...
- 3招搞定APP注册作弊
在说如何应对之前,易盾先给各位盾友梳理移动端APP可能遇到哪些作弊风险.1. 渠道商刷量,伪造大量的下载量和装机量,但没有新用户注册:2. 对于电商.P2P.外卖等平台,会面临散户或者团队刷子的注册- ...
- 关于transition动画下,如果有fixed元素,渲染的奇葩问题
之前我们机票页面有生成一个低价日历,然后我们有一个需求就是滚动到那个月份,对应显示这个月,然后这个区域是fixed定位的,然后奇怪的事情发生了,就是低价日历的动画执行完后,修改页面的html却没有正常 ...
- 【廖雪峰老师python教程】——模块
使用模块 任何模块代码的第一个字符串都被视为模块的文档注释: 使用__author__变量把作者写进去,这样当你公开源代码后别人就可以瞻仰你的大名: 当我们在命令行运行模块文件时,Python解释器把 ...
- NOI中“大整数加法”问题不能AC的解决建议
一.检查输入000和00相加是否出结果. 二.数组不要开小了,亲测256的数组不够.推荐1024. 附录AC程序: 如果不能AC请将256改为1024,255改为1023. #include &l ...
- nodeJs 调试异步程序追踪异步报错
DeprecationWarning: Calling an asynchronous function without callback is deprecated. 翻译: 不建议在不回调的情况下 ...
- centos7.4内核从3.10升级到4.14详细步骤
由于我们的docker学习中的Overlay需要内核版本在3.12+,所以在安装完centos7.4之后要进行内核升级,下面是升级步骤:1.导入keyrpm --import https://www. ...
- NO1——线段树
/* 数组存储 */ /* 预处理 */ #include <iostream> #include <cstdio> #include <algorithm> #i ...
- Linux nohup 后台运行命令
有一些爬虫的程序需要在后台运行,所以简单总结了一下nohup 的一些用法 基本命令:nohup command $; 运行之后出现nohup: ignoring input and appendin ...
- 日历插件DatePicker
Datepicker 地址:https://getuikit.com/v2/docs/datepicker.html