题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2555

要维护 right 集合的大小。因为 fa 会变,且 fa 构成一棵树,所以考虑用 LCT 来维护……

和平常写的 LCT 不太一样。因为要的值是原树上子树里的值,所以没有 makeroot ,splay 里不维护 splay 里的子树信息,只维护加法标记,表示 link 一下就给原树的自己到根的那条链上的所有点加了自己的值。cut 就是减掉自己的值。所以 query 或者 splay 的时候先把自己这棵 splay 里自己到根的路径 pshd 一遍,且没有 pshp 什么的。而且 link 时要区分两个点哪个是原树上的父亲。

不知怎么看出字符只有大写字母的。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,K=,M=3e6+;
int cnt=,lst=,go[N][K],fa[N],l[N],mask;
int c[N][],pre[N],sta[N],top,sm[N],tg[N];
char ch[M];
void decodeWithMask(int n,int mask)
{
for(int i=;i<n;i++)
{
mask=(mask*+i)%n;
swap(ch[i],ch[mask]);
}
}
bool isroot(int x){return c[pre[x]][]!=x&&c[pre[x]][]!=x;}
void pshd(int x)
{
if(!tg[x])return;int ls=c[x][],rs=c[x][];
sm[ls]+=tg[x];tg[ls]+=tg[x];sm[rs]+=tg[x];tg[rs]+=tg[x];
tg[x]=;
}
void Pshd(int x)
{
sta[top=]=x;
for(;!isroot(x);x=pre[x])sta[++top]=pre[x];
for(int i=top;i;i--)pshd(sta[i]);
}
void rotate(int x)
{
int y=pre[x],z=pre[y];
if(!isroot(y))c[z][y==c[z][]]=x;
pre[x]=z;
int d=(x==c[y][]);
pre[c[x][!d]]=y; pre[y]=x;
c[y][d]=c[x][!d]; c[x][!d]=y;
}
void splay(int x)
{
Pshd(x);
while(!isroot(x))
{
int y=pre[x],z=pre[y];
if(!isroot(y))
{
if((y==c[z][])^(x==c[y][]))rotate(x);
else rotate(y);
}
rotate(x);
}
}
void access(int x)
{
for(int t=;x;splay(x),c[x][]=t,t=x,x=pre[x]);
}
void link(int x,int y)
{
pre[y]=x;access(x);splay(x);
sm[x]+=sm[y]; tg[x]+=sm[y];//tg:pre of x all added
}
void cut(int x)
{
access(x);splay(x);
sm[c[x][]]-=sm[x]; tg[c[x][]]-=sm[x];//tg:pre of x all declined
pre[c[x][]]=; c[x][]=;
}
void add(int w)
{
int p=lst,np=++cnt;lst=np;l[np]=l[p]+;sm[np]=;
for(;p&&!go[p][w];p=fa[p])go[p][w]=np;
if(!p)fa[np]=,link(,np);
else
{
int q=go[p][w];
if(l[q]==l[p]+)fa[np]=q,link(q,np);
else
{
int nq=++cnt;l[nq]=l[p]+;
cut(q);link(fa[q],nq);link(nq,q);link(nq,np);///
fa[nq]=fa[q];fa[q]=nq;fa[np]=nq;//after link&cut !
memcpy(go[nq],go[q],sizeof go[q]);
for(;go[p][w]==q;p=fa[p])go[p][w]=nq;
}
}
}
int query(int len)
{
int cr=;
for(int i=;i<len;i++)
{
if(!go[cr][ch[i]-'A'+])return ;
cr=go[cr][ch[i]-'A'+];
}
Pshd(cr); return sm[cr];
}
int main()
{
int Q;scanf("%d",&Q);scanf("%s",ch);
int n=strlen(ch);for(int i=;i<n;i++)add(ch[i]-'A'+);
char tch[];
while(Q--)
{
scanf("%s",tch);scanf("%s",ch);n=strlen(ch);
decodeWithMask(n,mask);
if(tch[]=='A')
{
for(int i=;i<n;i++)add(ch[i]-'A'+);
}
else
{
int d=query(n);printf("%d\n",d);
mask^=d;
}
}
return ;
}

bzoj 2555 SubString——后缀自动机+LCT的更多相关文章

  1. bzoj 2555 SubString —— 后缀自动机+LCT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2555 建立后缀自动机,就可以直接加入新串了: 出现次数就是 Right 集合的大小,需要查询 ...

  2. bzoj 2555: SubString 后缀自动机+LCT

    2555: SubString Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 688  Solved: 235[Submit][Status][Dis ...

  3. BZOJ 2555: SubString 后缀自动机_LCT

    很水的一道题,就是有些细节没注意到. 比如说将调试信息误以为是最终结果而多调了20分钟QAQ ..... 我们注意到,每新加一个节点,改变的是该节点沿着 Parent 走一直走到根节点. 对应的,在 ...

  4. bzoj 2555 SubString(SAM+LCT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2555 [题意] 给定一个字符串,可以随时插入字符串,提供查询s在其中作为连续子串的出现 ...

  5. 【BZOJ2555】SubString 后缀自动机+LCT

    [BZOJ2555]SubString Description 懒得写背景了,给你一个字符串init,要求你支持两个操作         (1):在当前字符串的后面插入一个字符串         (2 ...

  6. bzoj 5408: string 后缀自动机 + LCT

    联赛前练练码力. code: #include <vector> #include <cstdio> #include <cstring> #include < ...

  7. ●BZOJ 2555 SubString

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2555题解: 后缀自动机+LCT 不难发现,对于输入的询问串,在自动机里trans后的到的状态 ...

  8. bzoj 2555: SubString【后缀自动机+LCT】

    一直WA--找了半天错的发现居然是解密那里的mask其实是不能动的--传进去的会变,但是真实的那个不会变-- 然后就是后缀自动机,用LCT维护parent树了--注意不能makeroot,因为自动机的 ...

  9. 字符串(LCT,后缀自动机):BZOJ 2555 SubString

    2555: SubString Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1620  Solved: 471 Description 懒得写背景了 ...

随机推荐

  1. [翻译]PostCSS简介

    许多开发人员花时间在使用CSS的预处理器上如less,sass和stylus.这些工具已经成为Web开发的重要组成部分.写一个网站的样式,不使用嵌套,变量或混入等功能很少见.它们每个都是非常实用的,让 ...

  2. 【I/O】File常见用法总结

    java.io.File file可能是一个文件或者文件夹. 获取目录列表(全部/过滤) import java.io.File; import java.io.FilenameFilter; imp ...

  3. fabric动态获取远程目录列表

    #!/usr/bin/pythonfrom fabric.api import *env.user='root'env.hosts=['172.10.224.183','172.10.224.132' ...

  4. JQuery -- 介绍,选择器及其示例, 基本选择器,层次选择器,过滤选择器,表单选择器

    1. 什么是jQuery对象 jQuery 对象就是通过jQuery包装DOM对象后产生的对象. jQuery对象是jQuery独有的.如果一个对象是jQuery对象,那么它就可以使用jQuery里的 ...

  5. CodeChef CHEFSOC2 Chef and Big Soccer 水dp

    Chef and Big Soccer   Problem code: CHEFSOC2 Tweet     ALL SUBMISSIONS All submissions for this prob ...

  6. oracle数据库插入优化

    通过程序要把1000万的数据插入到数据表中,刚开始每100条数据耗时50ms左右,但是越往后越慢,最慢到了十几秒的都有,真实好坑了. 于是在网上百度了一波,如何进行insert优化.倒是有了一点小小的 ...

  7. cors实现跨域(.net和jquery)

    本文引用自:http://blog.csdn.net/xuwei_xuwei/article/details/29845865 客户端 一个jquery cors请求例子: $.ajax({     ...

  8. RxJava+RxAndroid+MVP入坑实践(基础篇)

    转载请注明出处:http://www.blog.csdn.net/zhyxuexijava/article/details/51597230.com 前段时间看了MVP架构和RxJava,最近也在重构 ...

  9. Python 乘法口诀表

    环境 Anaconda3 Python 3.6, Window 64bit 目的 输出9*9 乘法口诀表 代码 # -*- coding: utf-8 -*- ''' 1*1=1 2*1=2 2*2= ...

  10. visual stdio 2012 c#学习笔记1

    visual stdio 2012 c#学习笔记1 1 我在安装过程中选择的是英文版本,不过刚入手,所以想先从中文菜单入手,所以需要安装中文语言包: microsoft的中文语言包下载地址为:http ...