SPOJ 1811 Longest Common Substring
Description
给出两个字符串,求最长公共子串.
Sol
SAM.
这题随便做啊...后缀数组/Hash+二分都可以.
SAM就是模板啊...直接在SAM上跑就行,没有了 \(go[w]\) 就往 \(par\) 跳.
每走一步统计一下答案.
Code
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std; const int N = 250005; struct State{
State *par,*go[26];
int val;
State(int _val):par(0),val(_val){ memset(go,0,sizeof(go)); }
}*rt,*lst;
void extend(int w){
State *p=lst,*np=new State(p->val+1);
while(p && p->go[w]==0) p->go[w]=np,p=p->par;
if(!p) np->par=rt;
else{
State *q=p->go[w];
if(q->val == p->val+1) np->par=q;
else{
State *nq=new State(p->val+1);
memcpy(nq->go,q->go,sizeof(q->go));
nq->par=q->par;
np->par=q->par=nq;
while(p && p->go[w] == q) p->go[w]=nq,p=p->par;
}
}lst=np;
} char A[N],B[N];
int la,lb,ans,len; void work(){
State *t=rt;
for(int i=0;i<lb;i++){
for(;t && !t->go[B[i]-'a'];len=(t=t->par) ? t->val : 0);
if(t && t->go[B[i]-'a']) t=t->go[B[i]-'a'],len++;else t=rt;
ans=max(ans,len);
}
}
int main(){
rt=new State(0),lst=rt; scanf("%s%s",A,B);
la=strlen(A),lb=strlen(B); for(int i=0;i<la;i++) extend(A[i]-'a'); work();
return cout<<ans<<endl,0;
}
SPOJ 1811 Longest Common Substring的更多相关文章
- SPOJ 1811. Longest Common Substring (LCS,两个字符串的最长公共子串, 后缀自动机SAM)
1811. Longest Common Substring Problem code: LCS A string is finite sequence of characters over a no ...
- SPOJ 1811 Longest Common Substring (后缀自动机第一题,求两个串的最长公共子串)
题目大意: 给出两个长度小于等于25W的字符串,求它们的最长公共子串. 题目链接:http://www.spoj.com/problems/LCS/ 算法讨论: 二分+哈希, 后缀数组, 后缀自动机. ...
- SPOJ 1811 Longest Common Substring(求两个串的最长公共子串 || 或者n个串)
http://www.spoj.com/problems/LCS/ 题目:求两个串的最长公共子串 参考:https://www.cnblogs.com/autoint/p/10345276.html: ...
- SPOJ 1811 Longest Common Substring 后缀自动机
模板来源:http://www.neroysq.com/?p=76 思路:http://blog.sina.com.cn/s/blog_7812e98601012dfv.html 题意就是求两个字符串 ...
- ●SPOJ 1811 Longest Common Substring
题链: http://poj.org/problem?id=2774 题解: 求两个字符串(S,T)的最长公共子串.对 S串建后缀自动机.接下来就用这个自动机去求出能和 S串匹配的 T的每一个前缀的最 ...
- 【SPOJ】Longest Common Substring II (后缀自动机)
[SPOJ]Longest Common Substring II (后缀自动机) 题面 Vjudge 题意:求若干个串的最长公共子串 题解 对于某一个串构建\(SAM\) 每个串依次进行匹配 同时记 ...
- 【SPOJ】Longest Common Substring(后缀自动机)
[SPOJ]Longest Common Substring(后缀自动机) 题面 Vjudge 题意:求两个串的最长公共子串 题解 \(SA\)的做法很简单 不再赘述 对于一个串构建\(SAM\) 另 ...
- 【SPOJ】Longest Common Substring II
[SPOJ]Longest Common Substring II 多个字符串求最长公共子串 还是将一个子串建SAM,其他字符串全部跑一边,记录每个点的最大贡献 由于是所有串,要对每个点每个字符串跑完 ...
- 【SPOJ】Longest Common Substring
[SPOJ]Longest Common Substring 求两个字符串的最长公共子串 对一个串建好后缀自动机然后暴力跑一下 废话 讲一下怎么跑吧 从第一个字符开始遍历,遍历不到了再沿着\(pare ...
随机推荐
- can not import Flask错误
在学习flask官方文档——应用构建代码时,遇到了一个小问题照例子敲好代码以后出现了can not import Flask错误,思考很久也没有解决,最后发现是因为应用模块和flask重名了.下面是 ...
- hdu 1873 看病要排队(优先级队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1873 题目大意: 三个医生看病,病人排队看病,病人有优先级,优先级高的提前看病,同样的优先级按先后.I ...
- Interesting things in Unity 4.5 you probably didn't know about
http://va.lent.in/interesting-things-in-unity-4-5-you-probably-didnt-know-about/
- 3D Math Library的姿势
http://www.opentk.com/doc/math http://www.gamedev.net/topic/484756-fast-vector-math-library-for-net/ ...
- IdentityDbContext
Move the ApplicationUser definition to your DAL. Inherit your MyDbContext from IdentityDbContext< ...
- js字节转换、字节转换GB等
//文件大小换算 function bytesToSize(bytes) { if (bytes === 0) return '0 B'; var k = 1024; sizes = ['B','KB ...
- Win7电脑无法启用无线连接或无线连不上网
1. 上不去网,看是否是无线网卡禁止. 2. 打开控制面板--网络和Internet--查看网络状态和任务--更改网络适配器 3. 4.若启用后无线网络连接仍为灰色,继续往下看 5.点击开始,找到运行 ...
- nginx同一iP多域名配置方法
文章转自:http://blog.itblood.com/nginx-same-ip-multi-domain-configuration.html 下面的是我本机的配置: server { list ...
- CF451D Count Good Substrings (DP)
Codeforces Round #258 (Div. 2) Count Good Substrings D. Count Good Substrings time limit per test 2 ...
- php apache用户写文件夹权限设置
php一般是以apache用户身份去执行的,把apache加入到存储你文件的父文件夹属组里去,然后改该父文件夹权限为775,这样属组成员就有写的权限,而apache属于这个组就可以改写该目录下所有文件 ...