题目:http://www.spoj.com/problems/LCS/

题意:给两个串A和B,求这两个串的最长公共子串。

分析:其实本题用后缀数组的DC3已经能很好的解决,这里我们来说说利用后缀自动机如何实现。

对于串A和B,我们先构造出串A的后缀自动机,那么然后用B串去匹配,对于B,我们一位一位地扫描,维护一个ans值,表示从

B串的开始到B[i]的这个子串与A的最长公共子串。

假设现在到B[i-1]的最长公共子串长度为ans,然后我们来看B[i],如果当前节点有B[i]这个孩子,那么直接就len++即可。

如果没有就找一直向前找pre,直到找到有B[i]这个孩子的节点。

#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
using namespace std;
const int N=250005;
struct State
{
State *pre,*go[26];
int step;
void clear()
{
pre=0;
step=0;
memset(go,0,sizeof(go));
}
}*root,*last;
State statePool[N*2],*cur;
void init()
{
cur=statePool;
root=last=cur++;
root->clear();
}
void Insert(int w)
{
State *p=last;
State *np=cur++;
np->clear();
np->step=p->step+1;
while(p&&!p->go[w])
p->go[w]=np,p=p->pre;
if(p==0)
np->pre=root;
else
{
State *q=p->go[w];
if(p->step+1==q->step)
np->pre=q;
else
{
State *nq=cur++;
nq->clear();
memcpy(nq->go,q->go,sizeof(q->go));
nq->step=p->step+1;
nq->pre=q->pre;
q->pre=nq;
np->pre=nq;
while(p&&p->go[w]==q)
p->go[w]=nq, p=p->pre;
}
}
last=np;
}
char A[N],B[N];
int main()
{
int n,m;
scanf("%s%s",A,B);
n=strlen(A);
m=strlen(B);
init();
for(int i=0; i<n; i++)
Insert(A[i]-'a');
int ans=0,len=0;
State *p=root;
for(int i=0; i<m; i++)
{
int x=B[i]-'a';
if(p->go[x])
{
len++;
p=p->go[x];
}
else
{
while(p&&!p->go[x]) p=p->pre;
if(!p) p=root,len=0;
else   len=p->step+1,p=p->go[x];
}
ans=max(ans,len);
}
printf("%d\n",ans);
return 0;
}

SPOJ1811最长公共子串问题(后缀自动机)相关推荐

  1. 求两个字符串的LCS(最长公共子串)后缀数组

    题意: 给两个字符串,求出它们的最长公共子串的长度. 比如 yeshowmuchiloveyoumydearmotherreallyicannotbelieveit yeaphowmuchilovey ...

  2. hihocoder 1465 : 后缀自动机五·重复旋律8(后缀自动机+最长公共子串)

    1465 : 后缀自动机五·重复旋律8 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的 ...

  3. [XSY] 最长公共子串对(后缀自动机)

    最长公共子串对 先放一段考场暴力代码: #include<iostream> #include<cstdio> #include<cstring> using na ...

  4. SPOJ1812(后缀自动机求n个串的最长公共子串)

    题目:http://www.spoj.com/problems/LCS2/ 题意:给定n个串,求它们的最长公共子串. 思路就是:先将一个串建SAM,然后用后面的串去匹配,对于每一个串,保存最大值,对于 ...

  5. SPOJ - PHRASES Relevant Phrases of Annihilation —— 后缀数组 出现于所有字符串中两次且不重叠的最长公共子串...

    题目链接:https://vjudge.net/problem/SPOJ-PHRASES PHRASES - Relevant Phrases of Annihilation no tags  You ...

  6. #1415 : 后缀数组三·重复旋律3 (最长公共子串)

    思路 将两个字符串合成一个字符串,中间加上一个"#".然后求height[i]height[i]height[i]. 最长公共子串如果存在,必定是相邻的height[i]heigh ...

  7. 最长公共子串(SA和SAM求法)

    这里主要介绍两种求多个字符串最长公共子串的方法. 这里我们以[POI2000]公共串为例题来讲一下这两种不同的方法的区别. 前置知识:后缀数组.后缀自动机 首先先讲一下SA的求法: 我们可以很容易的想 ...

  8. 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和...

    最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和 文章作者:Yx.Ac   文章来源:勇幸|Thinking (http://www.ahathi ...

  9. 2018.12.17-dtoj-1170-最长公共子串

    题目描述: 给定两个字符串A和B,求最长公共子串. 算法标签:后缀数组 以下代码: #include<bits/stdc++.h> #define il inline using name ...

最新文章

  1. 把qss添加进qrc文件_PDF怎么压缩?一招教你快速压缩PDF文件
  2. php 下载脱离服务器,php – 强制从外部服务器下载并重命名
  3. mysql的limit性能优化
  4. php设计模式中的类型安全 指--只接受特定的对象 ---以避免发生错误
  5. 东北育才 数论专场第2场
  6. python基础学习[python编程从入门到实践读书笔记(连载六)]:数据可视化项目第17章
  7. 计算机小白学UI,小白学UI设计有什么技巧?看完这些你就明白了
  8. jq点击所有子元素_jQuery删除/清空指定元素下的所有子节点的方法
  9. LeetCode 1717. 删除子字符串的最大得分
  10. 小程序【笔记001】框架和配置文件
  11. 计算机视觉论文-2021-05-11
  12. ISO26262解析(六)——硬件集成测试
  13. springboot权限管理系统
  14. qq出示测试软件语音聊天,QQ语音时语音测试时可以听到声音,播放测试语音时听不到,也听不到好友发来的语音,请问怎么处理...
  15. SecureCRT串口调试工具配置
  16. DBLP数据集用weka数据挖掘 xml转csv格式文件
  17. python橙色_如何自定义橙色Firefox菜单按钮的外观
  18. 赵栋/东文才 《面向对象程序设计(java)》第十一周学习总结
  19. How To Insult Your Enemies
  20. 简单PS CS6抠图技巧

热门文章

  1. Zuul:路由转发,排除和自定义
  2. 单例模式源码分析(jdk+spring+mybatis)
  3. Bootstrap组件_巨幕,页头,缩略图
  4. android vivox21 适配,还在苦等Android P的适配?原来这些功能vivo X21早都有了
  5. 【面试】JAVA六种运算符详解及优先级
  6. 关于myeclipse buildpath的jar包不能复制到tomcat lib下的问题
  7. React中的状态管理---Mobx
  8. spring jdbctemplate调用存储过程,返回list对象
  9. Notepad++ JSON关键字自动提示
  10. Placeholder in IE8 and older