SPOJ_LCS
经典题目,求两个串的最长公共子串。
是这样来做的。
以第一个串构造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的更多相关文章
- SPOJ 1811. Longest Common Substring (LCS,两个字符串的最长公共子串, 后缀自动机SAM)
1811. Longest Common Substring Problem code: LCS A string is finite sequence of characters over a no ...
随机推荐
- Error:(1, 1) java: 非法字符: ‘\ufeff’
一.问题 用IDEA打开eclipse java项目编译时,出现以下错误: Error:(1, 1) java: 非法字符: '\ufeff' Error:(1, 10) java: 需要class, ...
- UWP UserControl 不会自适应大小
在一般的Page里面,我们通过VisualStateManager,可以根据窗体的宽度,来调整一些控件大小. <VisualStateManager.VisualStateGroups> ...
- 用C链表实现约瑟夫环问题
问题:设有n个人围成一个圆圈,现从第s个人开始报数,数到第m的人出列,然后从出列的下一个人重新开始报数,数到第m的人再次出列,如此反复,直到所有的人全部出列为止.对于任意给定的n.s.m,求按出列次序 ...
- pandas安装以及出现的问题
pandas安装以及出现的问题 1.pandas 安装 pandas是Python的第三方库,所以使用前需要安装一下,直接使用pip install pandas就会自动安装,安装成功后显示的以下的信 ...
- tpshop购物网站价格筛选功能的测试用例设计
测试对象:红框内的“价格筛选功能” 以下是功能需求: 1. 除了空以外,输入框不能输入数字之外的内容. 备注:如果出现数字之外的内容,输入框禁止输入. 2. 输入框不能小于0 备注:如果出现小于0的数 ...
- 九九乘法表的python复习
九九开始的复习 这周复习之前的学的知识关于range函数,gormat函数,print的使用总结一下 从一个小例子开始,开始我的回顾吧, 大家都是从那个九九乘法表开始的数学之旅,从一一得一,开始了我们 ...
- Hyperledger Fabric 1.0.1至Hyperledger Fabric 1.0.5所升级的内容及修复的问题
基础更新 各版本每次迭代都会有一些基础更新内容,如文档修改覆盖.测试用例完善.用户体验改进及删除冗余无效代码等… 下面分类介绍的是一些版本迭代的重要更新内容,因个人实操和理解有限,部分更新并未明确,如 ...
- 使用Java EE 在eclipse 开发动态的Web工程(Java web项目)
1.使用Java EE 在eclipse 开发动态的Web工程(Java web项目)1)开发开发选项切换到JavaEE2)可以在Windows->show view中找到package exp ...
- PHP处理表单数据的一个安全回顾(记录教训)
曾经看过一个安全文章中写过这么一条 表单输入数据要做 htmlspecialchars_decode 表单输出数据要做htmlspecialchars 当时还不是很理解为什么,自己也没遇到问题,所以就 ...
- centos6.9 安装完xampp 7.2.0后,执行/opt/lampp/lampp报错
# /opt/lampp/lampp egrep: error while loading shared libraries: libc.so.6: cannot open shared object ...