最长公共子串 后缀自动机
来源:互联网 发布:电子券怎么在淘宝使用 编辑:程序博客网 时间:2024/06/05 19:23
【题目描述】
给定两个字符串A和B,求它们的最长公共子串
【分析】
我们考虑将A串建成后缀自动机
令当前状态为s,同时最大匹配长度为len
我们读入字符x。如果s有标号为x的边, 那么s=trans(s,x),len = len+1
否则我们找到s的第一个祖先a,它有标号为x的边,令 s=trans(a,x),len=Max(a)+1。
如果没有这样的祖先,那么令s=root,len=0。
在过程中更新状态的最大匹配长度
注意到我们求的是对于任意一个Right集合中的r,最大的匹配长度。那么对于一个状态s,它的结果自然也可以作为它Parent的结果,我们可以从底到上更新一遍。
然后问题就解决了。
———来自陈立杰《后缀自动机讲稿》
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<ctime>#include<cmath>#include<algorithm>using namespace std;#define FILE "read"#define MAXN 200010#define up(i,j,n) for(int i=j;i<=n;++i)#define dn(i,j,n) for(int i=j;i>=n;--i)#define cmax(a,b) a=max(a,b)#define cmin(a,b) a=min(a,b)char ch[MAXN];int n,cnt(1),now(1),len,ans,mx[MAXN],par[MAXN],son[MAXN][27];void insert(int x){int p=now,np=++cnt;mx[np]=mx[now]+1; now=np;while(p&&!son[p][x]) son[p][x]=np,p=par[p];if(!p) par[np]=1;else{int q=son[p][x];if(mx[q]==mx[p]+1) par[np]=q;else{int nq=++cnt;mx[nq]=mx[p]+1;memcpy(son[nq],son[q],sizeof(son[q]));par[nq]=par[q];par[q]=par[np]=nq;while(p&&son[p][x]==q)son[p][x]=nq,p=par[p];}}}int walk(int x){while(!son[now][x]&&par[now]){now=par[now];len=mx[now];}if(!son[now][x]) return 0;now=son[now][x]; len++;return len;}int main(){freopen(FILE".in","r",stdin);freopen(FILE".out","w",stdout);scanf("%s",ch+1); n=strlen(ch+1);up(i,1,n) insert(ch[i]-'a');scanf("%s",ch+1); n=strlen(ch+1); now=1;up(i,1,n) cmax(ans,walk(ch[i]-'a'));printf("%d\n",ans);return 0;}
0 0
- 最长公共子串 后缀自动机
- [CODEVS3160]最长公共子串|后缀数组|后缀自动机
- SPOJ1811最长公共子串问题(后缀自动机)
- 后缀自动机(最长公共子串、模板)spoj1811
- 后缀自动机(多个穿的最长公共子串)spoj1812
- code vs 3160 最长公共子串(后缀自动机)
- poj 2774 最长公共子串--字符串hash或者后缀数组或者后缀自动机
- SPOJ LCS 最长公共子串 后缀自动机&后缀树(Ukkonen)
- SPOJ1812(后缀自动机求n个串的最长公共子串)
- SPOJ 1812 Longest Common Substring II 后缀自动机求多字符串最长公共子串
- spoj 1812(两个串的最长公共子串)后缀自动机
- SPOJ 题目1811 LCS - Longest Common Substring(后缀自动机求最长公共子串)
- 最长公共子串--后缀数组实现
- 后缀树 最长公共子串
- HDU1403(后缀数组--最长公共子串)
- 最长公共子串(后缀数组)
- 最长公共子串(后缀数组)
- 【poj2774】 后缀数组最长公共子串
- Android 面试题(一)
- 使用Ultra Librarian生成Cadence Allegro的PCB封装库和OrCAD Capture CIS的原理图库
- 删除项目的SVN信息 取消项目的SVN关联 简单粗暴
- 四旋翼飞行器的控制规律及算法实现
- NewsFragmentTabHost 导航栏
- 最长公共子串 后缀自动机
- Java Web开发中路径问题小结
- Java创建内部类对象
- Python函数式编程
- 安卓JNI/NDK开发3(进阶 在C代码中调用java方法)
- centos7.2+zabbix3.2+sedmail邮件告警
- magento 2.1.4 url出现版本号,怎样解决?
- 类继承中的一个知识点
- Codeforces 768C Jon Snow and his Favourite Number