题目大意:

给定两个字符串,存在三种操作,分别是在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的更多相关文章

  1. 一个用SAM维护多个串的根号特技

    一个用SAM维护多个串的根号特技 基本介绍 在多个串的字符串题中,往往会出现一类题需要用到某个子串是否在一些母串中出现.此时对于 \(\text{parent}\) 树的 \(\text{right} ...

  2. 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, \(\ ...

  3. 后缀自动机(SAM)

    *在学习后缀自动机之前需要熟练掌握WA自动机.RE自动机与TLE自动机* 什么是后缀自动机 后缀自动机 Suffix Automaton (SAM) 是一个用 O(n) 的复杂度构造,能够接受一个字符 ...

  4. 后缀自己主动机(SAM)学习指南

    *在学习后缀自己主动机之前须要熟练掌握WA自己主动机.RE自己主动机与TLE自己主动机* 什么是后缀自己主动机 后缀自己主动机 Suffix Automaton (SAM) 是一个用 O(n) 的复杂 ...

  5. 【洛谷4070】 [SDOI2016]生成魔咒(SAM)

    传送门 洛谷 Solution 考虑要求的是什么,前缀的本质不同的字符串个数? 如果只要求一个串那么显然答案是\(\sum_{i=1}^{tot}len[i]-len[fa[i]]\)(实际上这个并不 ...

  6. postgreSQL数据库的监控及数据维护

    目前postgreSQL数据库的管理,数据查询等都需要安装postgreSQL软件或安装pgadmin等,远程访问都需要先登录到服务器等繁琐的操作.如果是开发团队,那么每个开发,测试,管理人员都要经历 ...

  7. Oracle数据库的监控及数据维护

    目前Oracle数据库的管理,数据查询等都需要安装Oracle软件或安装Oracle Client等,远程访问都需要先登录到服务器等繁琐的操作.如果是开发团队,那么每个开发,测试,管理人员都要经历这个 ...

  8. CF1037H Security——SAM+线段树合并

    又是一道\(SAM\)维护\(endpos\)集合的题,我直接把CF700E的板子粘过来了QwQ 思路 如果我们有\([l,r]\)对应的\(SAM\),只需要在上面贪心就可以了.因为要求的是字典序比 ...

  9. 5.29 省选模拟赛 波波老师 SAM 线段树 单调队列 并查集

    LINK:波波老师 LINK:同bzoj 1396 识别子串 不过前者要求线性做法 后者可以log过.实际上前者也被我一个log给水过了. 其实不算很水 我自认跑的很快罢了. 都是求经过一个位置的最短 ...

随机推荐

  1. mongodb监控工具mongostat

    mongostat的使用及命令详解 mongostat是mongodb自带的状态检测工具,在命令行下使用,会间隔固定时间获取mongodb的当前运行状态,并输出. 1.常用命令格式: mongosta ...

  2. $.each遍历json数组

    1.遍历单层json数组 我们把idx和obj都打印出来看看,到底是什么东西 var json1 =[{"id":"1","tagName" ...

  3. ExtJs6级联combo的实现

    父类获取子类进行操作 { xtype: 'combo', store: Common.Dic.getDicData("IMAGE_BIG_TYPE") , multiSelect: ...

  4. Pandas速查手册中文版

    本文翻译自文章: Pandas Cheat Sheet - Python for Data Science ,同时添加了部分注解. 对于数据科学家,无论是数据分析还是数据挖掘来说,Pandas是一个非 ...

  5. JavaScript-Jquery实现全选反选

    html: <dl> <dt><input type="checkbox" id="checkAll" /><labe ...

  6. 算法题丨Move Zeroes

    描述 Given an array nums, write a function to move all 0's to the end of it while maintaining the rela ...

  7. 新概念英语(1-11)Is this your shirt ?

    Is this your shirt?Whose shirt is white? A:Whose shirt is that? Is this your shirt, Dave? Dave:No si ...

  8. python网络爬虫与信息提取 学习笔记day2

    Day2: 查看robots协议: 查看京东的robots协议 查看百度的robots协议,可以看到百度拒绝了搜狗的爬虫233 爬取京东商品页面相关信息: import requests url = ...

  9. 使用jQuery获取session中存储的list集合

    在网上查找了很多关于jQuery获取session都不可得,如果大家有更好的方式,欢迎留言 这里是使用jQuery发送Ajax请求到后台获取session jsp中没有代码 js代码 <scri ...

  10. python——模块与包2

    模块与包2 1 什么是包 包是一种通过使用.'模块名'来组织python模块名称空间的方式. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都 ...