博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SAM维护的在线LCS
阅读量:5161 次
发布时间:2019-06-13

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

题目大意:

给定两个字符串,存在三种操作,分别是在a,b串末尾加一个字符串,和询问两串的LCS

 

题解:

Get新套路:把两串建在同一SAM上,将重合的位置合并为同一节点,再加个标记数组,如果两者的LCS标记都存在那么就直接更新答案.

注意标记需要沿father上传,每新建一个节点就打上标记并更新祖先

 

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #define RG register 8 using namespace std; 9 const int N=5000005,M=10000005;10 char S[N];int ch[M][3],fa[M],cur=1,cnt=1,ans=0,n=0,s[2][N],m=0,dis[M],pre[2][N],l[N];11 int mark[M];long long ret=0;12 void updata(int p){13 while(fa[p] && (mark[p]&mark[fa[p]])!=mark[p]){14 if(mark[p]==3)ans=max(ans,dis[p]);15 mark[fa[p]]|=mark[p];16 p=fa[p];17 }18 if(mark[p]==3)ans=max(ans,dis[p]);19 }20 int build(int last,int k,int c)21 {22 cur=++cnt;dis[cur]=dis[last]+1;23 RG int p=last;24 for(;p && !ch[p][c];p=fa[p])ch[p][c]=cur;25 if(!p)fa[cur]=1;26 else{27 int q=ch[p][c];28 if(dis[q]==dis[p]+1)fa[cur]=q;29 else{30 int nt=++cnt;dis[nt]=dis[p]+1;31 memcpy(ch[nt],ch[q],sizeof(ch[q]));32 fa[nt]=fa[q];fa[q]=fa[cur]=nt;33 updata(q); /*不能忘记这个地方*/34 for(;ch[p][c]==q;p=fa[p])ch[p][c]=nt;35 }36 }37 mark[cur]|=(1<
>1)%2;fg1++;49 s[fg0][++l[fg0]]=fg1;50 if(pre[fg0][l[fg0]-1]==pre[fg0^1][l[fg0]-1] && fg1==s[fg0^1][l[fg0]]){51 pre[fg0][l[fg0]]=pre[fg0^1][l[fg0]];52 mark[pre[fg0][l[fg0]]]|=(1<

 

转载于:https://www.cnblogs.com/Yuzao/p/7287183.html

你可能感兴趣的文章
Directory类总结
查看>>
LoadRunner 接口测试 第二章
查看>>
Nginx 负载均衡
查看>>
activeMQ类型转换器
查看>>
位运算
查看>>
2018.07.13【省赛模拟】模拟B组 【GDOI2016模拟】作业分配
查看>>
ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。
查看>>
05-spring框架—— Spring 事务
查看>>
C#和Java的最大不同
查看>>
crc
查看>>
C#静态 xx相关学习
查看>>
mysql 查询常见时间段数据
查看>>
Web开发遇到的问题合集
查看>>
海量存储系列之一
查看>>
wcf可以返回的类型有哪些
查看>>
Android 基础Intent与Intent Filter
查看>>
Invalid AABB inAABB UnityEngine.Canvas:SendWillRenderCanvases()的解决办法
查看>>
poj1083
查看>>
500.19与500.20错误
查看>>
LUOGU P2709 小B的询问
查看>>