经典题目,求两个串的最长公共子串。

是这样来做的。

以第一个串构造SAM,第二个串在自动机上跟新一遍就可以了。

更新的过程是这样的,假设当前到达的状态点为x(初始状态为0点),下一个字符是c,如果当前状态没有c这条边就一直沿着pre指针走,直到找到第一个有c这条边的状态或者确认全部都没有。

更新是这样的,用一个数字保存上一次状态的最大长度tmp,现在到达了一个新的状态了,显然这个状态一定保证在第二个串出现,因为我是从第二个串里面一个一个字符地添加进来的,那么只要保证满足第一个串(即模式串)就可以了。怎么保证呢?只要不大于tmp不大于该状态的step值就可以了。为什么?因为能到达当前状态的话说明是可以存在这个长度的。tmp与step比较并且去较小值。就完成了更新了。

嗯其实还听简单的。

代码君上了:

#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 600300
using namespace std; int next[maxn][26],pre[maxn],step[maxn];
int N=0,last=0,n,p,q,np,nq;
char s[maxn]; void insert(int x,int m)
{
p=last,np=++N;
for (int i=0; i<26; i++) next[N][i]=0; pre[N]=0; step[N]=0;
step[np]=m;
for (;p!=-1 && next[p][x]==0; p=pre[p]) next[p][x]=np;
last=np;
if (p==-1) return;
q=next[p][x];
if (step[q]==step[p]+1) { pre[np]=q; return; }
nq=++N;
for (int i=0; i<26; i++) next[N][i]=0; pre[N]=0; step[N]=0;
step[nq]=step[p]+1;
pre[nq]=pre[q];
for (int i=0; i<26; i++) next[nq][i]=next[q][i];//注意指针不能乱。。
pre[np]=pre[q]=nq;
for (;p!=-1 && next[p][x]==q; p=pre[p]) next[p][x]=nq;
} int dfs()
{
int ans=0,tmp=0;
for (int i=1,cur=0; s[i]; i++)
{
int k=s[i]-'a';
while (next[cur][k]==0 && cur!=0) cur=pre[cur];
if (step[cur]<tmp) tmp=step[cur];
cur=next[cur][k];
if (cur) tmp++;
ans=max(ans,tmp);
}
return ans;
} int main()
{
pre[0]=-1;
for (int i=0; i<26; i++) next[0][i]=0; step[0]=0;
scanf("%s",s+1);
for (int i=1; s[i]; i++) insert(s[i]-'a',i);
scanf("%s",s+1);
printf("%d\n",dfs());
return 0;
}

  

SPOJ_LCS的更多相关文章

  1. SPOJ 1811. Longest Common Substring (LCS,两个字符串的最长公共子串, 后缀自动机SAM)

    1811. Longest Common Substring Problem code: LCS A string is finite sequence of characters over a no ...

随机推荐

  1. asp.net core结合NLog搭建ELK实时日志分析平台

    0.整体架构 整体架构目录:ASP.NET Core分布式项目实战-目录 一.介绍ELK 1.说明(此篇ELK采用rpm的方式安装在服务器上)-牛刀小试 承接上一篇文章的内容准备部署ELK来展示asp ...

  2. flag -- 诡异的memcache标记

    引子     打从去年一路北漂,进入无人货架行业,业务需求漫天飘,最近总算把工作都规划齐整.回望过去一年多的时间里,诸多东西值得整理,memcache就是其中一个.  看到java的工资高些,队伍中好 ...

  3. 从轻测到上线,WeTest与《一起来捉妖》测试方案大公开

    从2016年Pokémon GO引发的AR游戏热潮开始,国内就一直在期待新的一款具备代表性的AR游戏的头部作品. 4月11日的腾讯首款AR探索手游<一起来捉妖>不仅为国内市场注入了新的活力 ...

  4. dubbo 接口初入门

    最近公司开发新的一套系统,开发出来的方案会基于dubbo分布式服务框架开发的,那么什么是dubbo,身为测试的我,第一眼看到这个,我得去了解了解dubbo是啥玩意,为开展的测试工作做准备,提前先学 d ...

  5. c++引用与指针的关系

    目录 1.引用的概念及用法 2.引用做参数 3.引用做返回值 4.汇编层看引用的特性 5.引用和指针的区别和联系: 更多内容请移步专栏:https://blog.csdn.net/column/det ...

  6. linux 下awk后统计某一列数据之和简单的命令

    例如有文件test.txt格式如下: aaa:1 bbb:2 cat a|awk -F\: '{print"+"$2}'|xargs echo 0|bc -l

  7. DDMS_Threads的简单使用

    title: DDMS_Threads的简单使用 date: 2016-07-20 00:44:35 tags: [DDMS] categories: [Tool,IDE] --- 概述 本文记录在 ...

  8. PSP Daily软件beta版本——基于spec评论

    题目要求: 每个小组评论其他小组beta发布作品的软件功能说明书. 试用(并截图)所有其他小组的beta作品,与软件功能说明书对比,评论beta作品对软件功能说明书的实现. 根据软件功能说明书,测试所 ...

  9. MathExam6317

    自己取一个大气又可爱的标题 小学二年级的还没来得及写,大部分时间还是花在巩固和查阅新旧知识上了,通过看学习视频,查资料,看博客园的博客...下次完善好了交上. 一.预估与实际 PSP2.1 Perso ...

  10. java实验2实验报告(20135232王玥)

    实验二 Java面向对象程序设计 一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解 ...