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

建立后缀自动机,就可以直接加入新串了;

出现次数就是 Right 集合的大小,需要查询 Parent 树上的子树和;

所以可以用 LCT 维护 Parent 树,因为 Parent 树是有根树所以不需要 makeroot;

代码中的两种 cut 写法都可以,其实这里的 splay 节点上记的 siz 值不是 splay 子树里的而是原子树( Parent 树上)里的;

注意读入的函数内不改变 mask -_-

splay 用栈时不要改变 x !

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const xn=,xm=3e6+;
int fa[xn],lst=,cnt=,l[xn],go[xn][],siz[xn];
int pre[xn],c[xn][],sta[xn],top,lzy[xn],mask;
char dc[],s[xm];
void turn(int x,int w){siz[x]+=w; lzy[x]+=w;}//
bool isroot(int x){return c[pre[x]][]!=x&&c[pre[x]][]!=x;}
void pushdown(int x)
{
if(!lzy[x])return;
int ls=c[x][],rs=c[x][];
turn(ls,lzy[x]); turn(rs,lzy[x]);
lzy[x]=;
}
void rotate(int x)
{
int y=pre[x],z=pre[y],d=(c[y][]==x);
if(!isroot(y))c[z][c[z][]==y]=x;
pre[x]=z; pre[y]=x; pre[c[x][!d]]=y;
c[y][d]=c[x][!d]; c[x][!d]=y;
}
void splay(int x)
{
sta[top=]=x;
//while(!isroot(x))sta[++top]=pre[x],x=pre[x];//don't change x!!
for(int i=x;!isroot(i);i=pre[i])sta[++top]=pre[i];
while(top)pushdown(sta[top--]); while(!isroot(x))
{
int y=pre[x],z=pre[y];
if(!isroot(y))
{
if((c[y][]==x)^(c[z][]==y))rotate(x);
else rotate(y);
}
rotate(x);
}
}
void access(int x)
{
for(int t=;x;c[x][]=t,t=x,x=pre[x])splay(x);
}
void link(int x,int f)
{
pre[x]=f; access(f); splay(f); turn(f,siz[x]);//line to root
}
void Cut(int x)
{
access(x); splay(x); turn(c[x][],-siz[x]); pre[c[x][]]=; c[x][]=;//c[x][0]:parent
}
void cut(int x)//
{
access(x); int y=fa[x]; splay(y);//
turn(y,-siz[x]); fa[x]=; c[y][]=;
}
void add(int w)
{
int p=lst,np=++cnt; lst=np; l[np]=l[p]+; siz[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(np,q);
else
{
int nq=++cnt; l[nq]=l[p]+;
memcpy(go[nq],go[q],sizeof go[q]);
fa[nq]=fa[q]; link(nq,fa[q]);
fa[np]=nq; link(np,nq);
cut(q); fa[q]=nq; link(q,nq);
for(;go[p][w]==q;p=fa[p])go[p][w]=nq;
}
}
}
int query(int l)
{
int p=;//
for(int i=;i<l;i++)
{
if(!go[p][s[i]-'A'])return ;
p=go[p][s[i]-'A'];
}
access(p); splay(p); return siz[p];//
}
int main()
{
int Q; scanf("%d",&Q);
scanf("%s",s+); int l=strlen(s+);
for(int i=;i<=l;i++)add(s[i]-'A');
for(int i=;i<=Q;i++)
{
scanf("%s",dc); scanf("%s",s); l=strlen(s);
int tmp=mask;//!!-_-
for(int j=;j<l;j++)
{
tmp=(tmp*+j)%l;
char t=s[j]; s[j]=s[tmp]; s[tmp]=t;
}
if(dc[]=='A')for(int j=;j<l;j++)add(s[j]-'A');
else
{
int ans=query(l); mask^=ans;
printf("%d\n",ans);
}
}
return ;
}

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

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

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

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2555 要维护 right 集合的大小.因为 fa 会变,且 fa 构成一棵树,所以考虑用 L ...

  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. OpenSUSE 13.1上安装StrongSwan

    结果: 1)iOS 7.1设备能够拨IPSec VPN到StrongSwan电脑上面来 - Connect to VPN 2)iOS 设备浏览器能够訪问StrongSwan VPN所在的内网地址服务器 ...

  2. firfox浏览器常用快捷键

    Ctrl + 数字键来打开第N个标签页这种还要先数完再到键盘上找数字Ctrl + Page Up = 激活左边一个标签页Ctrl + Page Down = 激活右边一个标签页Ctrl + Tab = ...

  3. PS CC 破解安装教程(亲测可用)

    PS CC版本新增了一些更高效的切图工具,比如可以直接右击图层转化为PNG图像 下面介绍一种亲测可用的破解安装教程 软件下载地址:https://pan.baidu.com/s/1dFJFqhj 一. ...

  4. EasyPlayer Android RTSP播放器延迟再优化策略

    EasyPlayer延迟再优化策略 EasyPlayer是一款专门针对RTSP协议进行过优化的播放器.其中两个我们引以为傲的的优点就是起播快和低延迟.最近我们遇到一些需求,其对延迟要求非常苛刻,于是我 ...

  5. pip3 Fatal error in launcher: Unable to create process using '"' [转]

    在新环境上安装python的时候又再次遇到了这个情况,这次留意了一下,发现原来的文章有错误的地方,所以来更新一下,应该能解决大部分的问题. 环境是win8,原来只安装了python2.7.后来因为要用 ...

  6. Android之ProgressBar读取文件进度解析

    ProgressBar进度条, 分为旋转进度条和水平进度条,进度条的样式根据需要自定义,之前一直不明白进度条如何在实际项目中使用,网上演示进度条的案例大多都是通过Button点 击增加.减少进度值,使 ...

  7. python 创建一个实例:步骤二 添加行为方法,编写方法

    添加方法 class Person(): def __init__(self,name,job=None,pay=0): self.name= name self.job = job self.pay ...

  8. 怎么升级iOS10教程

    在前两天的开发者大会上刚推出了iOS10,我介绍一下怎么升级到iOS10的办法.所有人只用一个iPhone就可以升级到iOS10,不需要电脑,也不需要开发者账号. http://bbs.feng.co ...

  9. Linux系统资源查看与设置

    /proc/sys/fs/file-max = 65536 /proc/sys/net/ipv4/tcp_fin_timeout = 15 /proc/sys/net/ipv4/tcp_tw_recy ...

  10. hihocoder hiho第38周: 二分·二分答案 (二分搜索算法应用:二分搜索值+bfs判断可行性 )

    题目1 : 二分·二分答案 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回和上上回里我们知道Nettle在玩<艦これ>,Nettle在整理好舰队之后 ...