博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SPOJ 1811 LCS [后缀自动机]
阅读量:4355 次
发布时间:2019-06-07

本文共 1658 字,大约阅读时间需要 5 分钟。

题意:

求两个串的最大连续子串


 

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

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

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

#include 
#include
#include
#include
using namespace std;const int N=25e4+5;int n,m;char a[N],b[N];struct State{ int ch[26],par,val; State():par(0),val(0){memset(ch,0,sizeof(ch));}}t[N<<1];int sz,root,last;inline int nw(int _){t[++sz].val=_;return sz;}void iniSAM(){sz=0;root=last=nw(0);}void extend(int c){ int p=last,np=nw(t[p].val+1); while(p&&t[p].ch[c]==0) t[p].ch[c]=np,p=t[p].par; if(p==0) t[np].par=root; else{ int q=t[p].ch[c]; if(t[q].val==t[p].val+1) t[np].par=q; else{ int nq=nw(t[p].val+1); 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=1;i<=n;i++) extend(a[i]-'a'); int sum=0,u=root; for(int i=1;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=0;//puts("Not Found"); else sum=t[u].val+1,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+1,b+1); n=strlen(a+1);m=strlen(b+1); solve();}

 

转载于:https://www.cnblogs.com/candy99/p/6375701.html

你可能感兴趣的文章
ffmpeg添加水印
查看>>
Klein 数学讲座:附季理真代译序
查看>>
KeyWordHelper-关键字提取类(注:使用第三方组件DictSeg.dll)
查看>>
软件测试6班2组第一天任务分配
查看>>
惠普开源的通信测试工具Seagull的安装体会
查看>>
路由器
查看>>
用户体验
查看>>
浅析c++和c语言的enum类型
查看>>
sql编写注意
查看>>
(简单) POJ 2352 Stars,Treap。
查看>>
(中等) POJ 2948 Martian Mining,DP。
查看>>
Java IO输入输出
查看>>
一对一单向双向主键关联
查看>>
ecshop 调用其他数据库中的商品
查看>>
如何一步一步用DDD设计一个电商网站(十二)—— 提交并生成订单
查看>>
给用户授权以root身份执行ls,touch,passwd命令,但是禁止修改root用户密码
查看>>
SpringBoot访问NoSQL和简单的Thymeleaf-Spring-Spring-boot整合
查看>>
心跳检测机制
查看>>
Eclipse提交任务至Hadoop集群遇到的问题
查看>>
python BeautifulSoup4解析网页
查看>>