动态规划&字符串:最长公共子串
还是直接上转移方程:
动规只能解决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 ...
随机推荐
- HMM相关文章索引
HMM相关文章索引 1条回复 HMM系列文章是52nlp上访问量较高的一批文章,这里做个索引,方便大家参考. HMM学习 HMM学习最佳范例一:介绍 HMM学习最佳范例二:生成模式 HMM学习最佳范例 ...
- Borland和Micorsoft的对话(转载自月光软件网)
Borland与Microsoft关于Delphi的对话 Bear 1.Delphi较贵 一套Delphi的价格大约相当于两套Visual Studio ------------------- ...
- Android TextView 单行文本的坑
这是android系统的一个bug,描述如下:https://code.google.com/p/android/issues/detail?id=33868 具体来说就是当一个TextView设置了 ...
- Python初步
准备在工作之余看看Python的东西 收录一些资料 Python初学者(零基础学习Python.Python入门)常见问题:书籍推荐.资料.社区 http://blog.csdn.net/xiaowa ...
- mysql数据库----Pymysql
本节重点: pymysql下载和使用 sql注入 增.删.改:conn.commit() 查:fetchone.fetchmany.fetchall 一.pymysql的下载和使用 之前我们都是通过M ...
- z 变换
1. z 变换 单位脉冲响应为 \(h[n]\) 的离散时间线性时不变系统对复指数输入 \(z^n\) 的响应 \(y[n]\) 为 \[ \tag{1} y[n] = H(z) z^{n}\] 式中 ...
- LeetCode 29——两数相除
1. 题目 2. 解答 2.1. 方法一 题目要求不能使用乘法.除法和除余运算,但我们可以将除法转移到对数域. \[ \frac{a}{b} = e^{\frac{lna}{lnb}} = e^{ln ...
- webstorm-前端javascript开发神器中文教程和技巧分享(转)
webstorm是一款前端javascript开发编辑的神器,此文介绍webstorm的中文教程和技巧分享. webstorm8.0.3中文汉化版下载: 百度网盘下载:http://pan.baidu ...
- C语言单元测试
转自http://blog.csdn.net/colin719/article/details/1420583 对于敏捷开发来说,单元测试必不可少,对于Java开发来说,JUnit非常好,对于C++开 ...
- PokeCats开发者日志(四)
现在是PokeCats游戏开发的第八天的上午,感觉游戏做得差不多了,来写一下开发者日志吧! (1)增加闯关模式,一共30关. (2)更改了最后一关的主题,更换了背景,将树桩改为礼物盒. ...