SPOJ1812:Longest Common Substring(后缀自动机)
来源:互联网 发布:电脑笔记软件 知乎 编辑:程序博客网 时间:2024/06/09 23:21
传送门
给两个字符串,求其最长公共子串
题解:后缀自动机。
考虑后缀自动机的link指针,指向比当前子串长度小的子串后缀(有点类似AC自动机的fail)。
匹配的时候同AC自动机,不过调fail时将当前长度置为当前状态的len值(因为是前一个字符串的后缀,所以都可以匹配)。
#include<bits/stdc++.h>#include<vector>using namespace std;const int Maxn=5e5+50;int n;char S[Maxn];struct sam{ int len[Maxn],link[Maxn],last,rt,cnt,pos[Maxn],son[Maxn][26]; sam() { rt=last=cnt=1;len[0]=-1; for(int i=0;i<=25;i++)son[0][i]=1; } inline void extend(int c,int Pos) { int p=last,np=++cnt;pos[np]=Pos;len[np]=len[last]+1;last=cnt; while(p&&!son[p][c])son[p][c]=np,p=link[p]; if(!p)link[np]=rt; else { int q=son[p][c]; if(len[q]==len[p]+1)link[np]=q; else { int nq=++cnt;len[nq]=len[p]+1; memcpy(son[nq],son[q],sizeof(int)*26); link[nq]=link[q];link[q]=link[np]=nq; while(p&&son[p][c]==q)son[p][c]=nq,p=link[p]; } } }}sam;int main(){ scanf("%s",S+1);n=strlen(S+1); for(int i=1;i<=n;i++)sam.extend(S[i]-'a',i); scanf("%s",S+1);n=strlen(S+1); int nowpos=1,nowlen=0,maxlen=0; for(int i=1;i<=n;i++) { if(sam.son[nowpos][S[i]-'a']){nowpos=sam.son[nowpos][S[i]-'a'],nowlen++;} else { while(!sam.son[nowpos][S[i]-'a']) nowpos=sam.link[nowpos]; nowlen=sam.len[nowpos]+1;nowpos=sam.son[nowpos][S[i]-'a']; } maxlen=max(maxlen,nowlen); } cout<<maxlen<<endl; return 0;}
阅读全文
0 0
- SPOJ1812:Longest Common Substring(后缀自动机)
- [spoj1812]Longest Common Substring II && 后缀自动机
- 【spoj1812】Longest Common Substring II 后缀自动机
- SPOJ1812 Longest Common Substring II 后缀自动机
- spoj1812 Longest Common Substring II(LCS2),后缀自动机
- [SPOJ1812]LCS2 - Longest Common Substring II(后缀自动机)
- BZOJ2946 SPOJ1812:Longest Common Substring II(后缀自动机)
- SPOJ 1811 Longest Common Substring(后缀自动机)
- spoj1811 Longest Common Substring(LCS),后缀自动机
- spoj 1811 Longest Common Substring(后缀自动机)
- spoj 1812 Longest Common Substring II(后缀自动机)
- SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)
- [SPOJ1811]LCS - Longest Common Substring(后缀自动机)
- SPOJ Longest Common Substring II 后缀自动机(打印)
- spoj 1811 Longest Common Substring (后缀自动机)
- SPOJ LCS Longest Common Substring 后缀自动机
- [SPOJ LCS]Longest Common Substring && 后缀自动机
- 【后缀自动机】[SPOJ LCS]Longest Common Substring
- python中defaultdict方法使用详解
- 扩增子统计绘图7三元图
- 小米四启用虚拟按键以及禁用实体按键
- 初次linux下安装apache2.4.27遇到的一点问题和解决方法
- Cookie
- SPOJ1812:Longest Common Substring(后缀自动机)
- 树形背包O(nm)求解
- f(x)*(-1)^x的离散傅里叶变换及Matlab中如何绘制坐标轴
- 用tornado将flask部署到Nginx上
- 榴莲分配 递推
- liulu博客
- Java:面试题的一些总结
- LeetCode(34)--Search for a Range
- KMP算法解析