SAM维护的在线LCS
题目大意:
给定两个字符串,存在三种操作,分别是在a,b串末尾加一个字符串,和询问两串的LCS
题解:
Get新套路:把两串建在同一SAM上,将重合的位置合并为同一节点,再加个标记数组,如果两者的LCS标记都存在那么就直接更新答案.
注意标记需要沿father上传,每新建一个节点就打上标记并更新祖先
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
using namespace std;
const int N=,M=;
char S[N];int ch[M][],fa[M],cur=,cnt=,ans=,n=,s[][N],m=,dis[M],pre[][N],l[N];
int mark[M];long long ret=;
void updata(int p){
while(fa[p] && (mark[p]&mark[fa[p]])!=mark[p]){
if(mark[p]==)ans=max(ans,dis[p]);
mark[fa[p]]|=mark[p];
p=fa[p];
}
if(mark[p]==)ans=max(ans,dis[p]);
}
int build(int last,int k,int c)
{
cur=++cnt;dis[cur]=dis[last]+;
RG int p=last;
for(;p && !ch[p][c];p=fa[p])ch[p][c]=cur;
if(!p)fa[cur]=;
else{
int q=ch[p][c];
if(dis[q]==dis[p]+)fa[cur]=q;
else{
int nt=++cnt;dis[nt]=dis[p]+;
memcpy(ch[nt],ch[q],sizeof(ch[q]));
fa[nt]=fa[q];fa[q]=fa[cur]=nt;
updata(q); /*不能忘记这个地方*/
for(;ch[p][c]==q;p=fa[p])ch[p][c]=nt;
}
}
mark[cur]|=(<<k);
updata(cur);
return cur;
}
void work()
{
int Q,fg0,fg1;
scanf("%d",&Q);scanf("%s",S+);
pre[][]=pre[][]=;
for(int i=,x;i<=Q;i++){
x=S[i]-'';
fg0=(x^ans)%;fg1=((x^ans)>>)%;fg1++;
s[fg0][++l[fg0]]=fg1;
if(pre[fg0][l[fg0]-]==pre[fg0^][l[fg0]-] && fg1==s[fg0^][l[fg0]]){
pre[fg0][l[fg0]]=pre[fg0^][l[fg0]];
mark[pre[fg0][l[fg0]]]|=(<<fg0);
updata(pre[fg0][l[fg0]]);
}
else{
pre[fg0][l[fg0]]=build(pre[fg0][l[fg0]-],fg0,fg1);
}
ret+=ans;
}
printf("%lld\n",ret);
}
int main()
{
freopen("lcs.in","r",stdin);
freopen("lcs.out","w",stdout);
work();
return ;
}
SAM维护的在线LCS的更多相关文章
- 一个用SAM维护多个串的根号特技
一个用SAM维护多个串的根号特技 基本介绍 在多个串的字符串题中,往往会出现一类题需要用到某个子串是否在一些母串中出现.此时对于 \(\text{parent}\) 树的 \(\text{right} ...
- LCS2 - Longest Common Substring II(spoj1812)(sam(后缀自动机)+多串LCS)
A string is finite sequence of characters over a non-empty finite set \(\sum\). In this problem, \(\ ...
- 后缀自动机(SAM)
*在学习后缀自动机之前需要熟练掌握WA自动机.RE自动机与TLE自动机* 什么是后缀自动机 后缀自动机 Suffix Automaton (SAM) 是一个用 O(n) 的复杂度构造,能够接受一个字符 ...
- 后缀自己主动机(SAM)学习指南
*在学习后缀自己主动机之前须要熟练掌握WA自己主动机.RE自己主动机与TLE自己主动机* 什么是后缀自己主动机 后缀自己主动机 Suffix Automaton (SAM) 是一个用 O(n) 的复杂 ...
- 【洛谷4070】 [SDOI2016]生成魔咒(SAM)
传送门 洛谷 Solution 考虑要求的是什么,前缀的本质不同的字符串个数? 如果只要求一个串那么显然答案是\(\sum_{i=1}^{tot}len[i]-len[fa[i]]\)(实际上这个并不 ...
- postgreSQL数据库的监控及数据维护
目前postgreSQL数据库的管理,数据查询等都需要安装postgreSQL软件或安装pgadmin等,远程访问都需要先登录到服务器等繁琐的操作.如果是开发团队,那么每个开发,测试,管理人员都要经历 ...
- Oracle数据库的监控及数据维护
目前Oracle数据库的管理,数据查询等都需要安装Oracle软件或安装Oracle Client等,远程访问都需要先登录到服务器等繁琐的操作.如果是开发团队,那么每个开发,测试,管理人员都要经历这个 ...
- CF1037H Security——SAM+线段树合并
又是一道\(SAM\)维护\(endpos\)集合的题,我直接把CF700E的板子粘过来了QwQ 思路 如果我们有\([l,r]\)对应的\(SAM\),只需要在上面贪心就可以了.因为要求的是字典序比 ...
- 5.29 省选模拟赛 波波老师 SAM 线段树 单调队列 并查集
LINK:波波老师 LINK:同bzoj 1396 识别子串 不过前者要求线性做法 后者可以log过.实际上前者也被我一个log给水过了. 其实不算很水 我自认跑的很快罢了. 都是求经过一个位置的最短 ...
随机推荐
- Flask学习 三 web表单
web表单 pip install flask-wtf 实现csrf保护 app.config['SECRET_KEY']='hard to guess string' # 可以用来存储框架,扩展,程 ...
- PV & PVC - 每天5分钟玩转 Docker 容器技术(150)
Volume 提供了非常好的数据持久化方案,不过在可管理性上还有不足. 拿前面 AWS EBS 的例子来说,要使用 Volume,Pod 必须事先知道如下信息: 当前 Volume 来自 AWS EB ...
- python性能分析--cProfile
Python标准库中提供了三种用来分析程序性能的模块,分别是cProfile, profile和hotshot,另外还有一个辅助模块stats.这些模块提供了对Python程序的确定性分析功能,同时也 ...
- EasyUI DataGrid 实现单行/多行编辑功能
要实现 EasyUI DataGrid 的可编辑很简单,在需要编辑的列添加 editor [编辑器]就可以了. 单行编辑 // 初始化数据列表 function initDatagrid() { $( ...
- Python内置函数(50)——issubclass
英文文档: issubclass(class, classinfo) Return true if class is a subclass (direct, indirect or virtual) ...
- Python内置函数(46)——format
英文文档: format(value[, format_spec]) Convert a value to a "formatted" representation, as con ...
- GIT入门笔记(13)- GUI GIT
- Python之递归函数
递归函数 初识递归函数 递归函数的定义:在一个函数里再调用这个函数本身 Python为了考虑保护内存占用情况,有一个递归深度的限制. 探究递归的默认最大深度: def foo(n): print(n) ...
- centos虚拟机nat模式,可以上内网,不能上外网
http://sky425509.iteye.com/blog/1996085 我这边的问题是,好久没用虚拟机了,重启之后,变成了dhcp模式,整个网卡配置变了. 重新配置了静态ip,网关,dns后才 ...
- VCS使用学习笔记(0)——写在前面的话
由于毕业设计做的是数字IC相关,虽然不是纯设计,但是也有设计相关.有设计就要有仿真验证,我就趁此机会来学习一下VCS的使用吧.当然,这里只是学习其简单的逻辑仿真功能,从波形仿真到覆盖率等,基本上不涉其 ...