题意:

求两个串的最大连续子串


一个串建SAM,另一个串在上面跑

注意如果走了Suffix Link,sum需要更新为t[u].val+1

Suffix Link有点像失配吧,当前状态s走不了了就到Suffix Link指向的状态fa上去,fa是s的后缀所以是可行的,并且有更多走的机会

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=25e4+;
int n,m;
char a[N],b[N];
struct State{
int ch[],par,val;
State():par(),val(){memset(ch,,sizeof(ch));}
}t[N<<];
int sz,root,last;
inline int nw(int _){t[++sz].val=_;return sz;}
void iniSAM(){sz=;root=last=nw();}
void extend(int c){
int p=last,np=nw(t[p].val+);
while(p&&t[p].ch[c]==) t[p].ch[c]=np,p=t[p].par;
if(p==) t[np].par=root;
else{
int q=t[p].ch[c];
if(t[q].val==t[p].val+) t[np].par=q;
else{
int nq=nw(t[p].val+);
memcpy(t[nq].ch,t[q].ch,sizeof(t[q].ch));
t[nq].par=t[q].par;
t[q].par=t[np].par=nq;
while(p&&t[p].ch[c]==q) t[p].ch[c]=nq,p=t[p].par;
}
}
last=np;
}
int ans;
void solve(){
iniSAM();
for(int i=;i<=n;i++) extend(a[i]-'a');
int sum=,u=root;
for(int i=;i<=m;i++){
//printf("hi %d %c \n",i,b[i]);
int c=b[i]-'a';
if(t[u].ch[c]) u=t[u].ch[c],ans=max(ans,++sum);//puts("ha");
else{
while(u&&!t[u].ch[c]) u=t[u].par;
if(!u) u=root,sum=;//puts("Not Found");
else sum=t[u].val+,u=t[u].ch[c],ans=max(ans,sum);//puts("Find");
}
//printf("u %d %d\n",u,sum);
}
printf("%d",ans);
}
int main(){
freopen("in","r",stdin);
scanf("%s%s",a+,b+);
n=strlen(a+);m=strlen(b+);
solve();
}

SPOJ 1811 LCS [后缀自动机]的更多相关文章

  1. POJ.2774.Long Long Message/SPOJ.1811.LCS(后缀自动机)

    题目链接 POJ2774 SPOJ1811 LCS - Longest Common Substring 确实比后缀数组快多了(废话→_→). \(Description\) 求两个字符串最长公共子串 ...

  2. POJ.2774.Long Long Message/SPOJ.1811.LCS(后缀数组 倍增)

    题目链接 POJ2774 SPOJ1811 LCS - Longest Common Substring 比后缀自动机慢好多(废话→_→). \(Description\) 求两个字符串最长公共子串 ...

  3. spoj 1811 LCS - Longest Common Substring (后缀自己主动机)

    spoj 1811 LCS - Longest Common Substring 题意: 给出两个串S, T, 求最长公共子串. 限制: |S|, |T| <= 1e5 思路: dp O(n^2 ...

  4. spoj 1812 lcsII (后缀自动机)

    spoj 1812 lcsII (后缀自动机) 题意:求多个串的lcs,最多10个串,每个串最长10w 解题思路:后缀自动机.先建好第一个串的sam,然后后面的串拿上去跑(这个过程同前一题).sam上 ...

  5. SPOJ - LCS 后缀自动机入门

    LCS - Longest Common Substring A string is finite sequence of characters over a non-empty finite set ...

  6. SPOJ LCS 后缀自动机

    用后缀自动机求两个长串的最长公共子串,效果拔群.多样例的时候memset要去掉. 解题思路就是跟CLJ的一模一样啦. #pragma warning(disable:4996) #include< ...

  7. SPOJ LCS 后缀自动机找最大公共子串

    这里用第一个字符串构建完成后缀自动机以后 不断用第二个字符串从左往右沿着后缀自动机往前走,如能找到,那么当前匹配配数加1 如果找不到,那么就不断沿着后缀树不断往前找到所能匹配到当前字符的最大长度,然后 ...

  8. Longest Common Substring II SPOJ - LCS2 (后缀自动机)

    Longest Common Substring II \[ Time Limit: 236ms\quad Memory Limit: 1572864 kB \] 题意 给出\(n\)个子串,要求这\ ...

  9. SPOJ NSUBSTR Substrings 后缀自动机

    人生第一道后缀自动机,总是值得纪念的嘛.. 后缀自动机学了很久很久,先是看CJL的论文,看懂了很多概念,关于right集,关于pre,关于自动机的术语,关于为什么它是线性的结点,线性的连边.许多铺垫的 ...

随机推荐

  1. 在 .NET中,一种更方便操作配置项的方法

    在应用程序的开发过程中,我们往往会为软件提供一些配置项,以允许软件根据配置项灵活来做事情,比如配置日志文件路径等,此外,我们还可以用配置项来为用户存储其偏好设置等. .NET 为我们默认提供了配置机制 ...

  2. 初识Spider_Man(爬爬虫)

    一:引子

  3. Core Animation 文档翻译(第三篇)

    Core Animation 文档翻译(第三篇) 设置Layer对象 当我们使用核心动画时,Layer对象是一切的核心.Layers 管理我们APP的可视化content,Layer也提供了conte ...

  4. for循环,数组

    for (var a=0; a<10; a++ ) for循环 声明a为0 循环a=9时(10次) 每循环一次a的值+1; { 循环体 } var a=Attr();var a=[];数组; / ...

  5. iis配置完成,出现HTTP 错误 403.14 - Forbidden

    版权声明:本文为博主原创文章,未经博主允许不得转载.转载请标明文章出处和原文链接. 403.14 禁止访问:在 Web 服务器上已拒绝目录列表 解决方案一:一般情况站点都是不会允许直接读取目录内容的, ...

  6. IDEA、Matlab 注释

    IDEA ctrl+/ 多行代码分行注释,再按一次取消 ctrl+shift+/ 多行代码注释在一个块里,只在开头和结尾有注释符号 Matlab 注释:Ctrl+/ Ctrl+R 取消注释:Ctrl+ ...

  7. Codeforces 900C Remove Extra One 模拟

    题目链接:900C Remove Extra One 题意: 首先record是指这个数比数列前面的所有数都大,给了n个数(1-n),删掉一个数,让整个数列的record值达到最大. 题解: 刚开始我 ...

  8. 闲聊cassandra

    原创,转载请注明出处 今天聊聊cassandra,里面用了不少分布式系统设计的经典算法比如consistent hashing, bloom filter, merkle tree, sstable, ...

  9. 转-python中的闭包

    出处:http://www.cnblogs.com/ma6174/archive/2013/04/15/3022548.html 记录下 简单说,闭包就是根据不同的配置信息得到不同的结果 再来看看专业 ...

  10. discuz数据库相关表

    discuz 数据表对照cdb_access               用户权限表      cdb_adminactions         管理动作表cdb_admingroups        ...