bzoj千题计划285:bzoj2555: SubString
http://www.lydsy.com/JudgeOnline/problem.php?id=2555
后缀自动机,用LCT维护parent树
一个串的出现次数 = parent 树 上 其所在状态 的 子树 叶节点 | Right | 之和
若在parent中np的子节点中加一个节点p,设p的 | Right | = sum,那么 根节点到np 的整条链上的所有状态的 | Right | 都要 + sum
若更换掉q原来的父节点, 设q的 | Right | = sum,那么 根节点到q 的整条链上的所有状态的 | Right | 都要 - sum
注意 decodeWithMask mask的修改 不影响全局的mask,全局的mask 只 会受 last_ans的影响
三个 无脑shabi错误的血泪史:


#include<cstdio>
#include<cstring>
#include<iostream> using namespace std; #define N 600002 char s[]; int tot=,fa[N<<],len[N<<],ch[N<<][];
int p,q,np,nq,last=; int mask;
string chars; int sum[N<<],tag[N<<];
int Sfa[N<<],Sch[N<<][]; int st[N<<],top; void decodeWithMask(int mask)
{
scanf("%s",s);
chars=s;
int n=chars.length();
for (int j=;j<n;j++)
{
mask=(mask*+j)%n;
char t=chars[j];
chars[j]=chars[mask];
chars[mask]=t;
}
} bool isroot(int x)
{
return Sch[Sfa[x]][]!=x && Sch[Sfa[x]][]!=x;
} bool getson(int x)
{
return Sch[Sfa[x]][]==x;
} void tagging(int x,int y)
{
sum[x]+=y; tag[x]+=y;
} void down(int x)
{
if(!tag[x]) return;
if(Sch[x][]) tagging(Sch[x][],tag[x]);
if(Sch[x][]) tagging(Sch[x][],tag[x]);
tag[x]=;
} void rotate(int x)
{
int y=Sfa[x],z=Sfa[y]; int k=getson(x);
if(!isroot(y)) Sch[z][Sch[z][]==y]=x;
Sch[y][k]=Sch[x][k^]; Sch[x][k^]=y;
Sfa[x]=z; Sfa[y]=x; Sfa[Sch[y][k]]=y;
} void splay(int x)
{
st[top=]=x;
for(int i=x;!isroot(i);i=Sfa[i]) st[++top]=Sfa[i];
for(int i=top;i;--i) down(st[i]);
int y;
while(!isroot(x))
{
y=Sfa[x];
if(!isroot(y)) rotate(getson(y)==getson(x) ? y : x);
rotate(x);
}
} void access(int x)
{
int t=;
while(x)
{
splay(x);
Sch[x][]=t;
t=x; x=Sfa[x];
}
} void link(int x,int f)
{
Sfa[x]=f;
access(f);
splay(f);
tagging(f,sum[x]);
} void cut(int x)
{
access(x);
splay(x);
tagging(Sch[x][],-sum[x]);
Sfa[Sch[x][]]=;
Sch[x][]=;
} void extend(int c)
{
len[np=++tot]=len[last]+;
sum[np]++;
for(p=last;p && !ch[p][c]; p=fa[p]) ch[p][c]=np;
if(!p) fa[np]=,link(np,);
else
{
q=ch[p][c];
if(len[q]==len[p]+) fa[np]=q,link(np,q);
else
{
len[nq=++tot]=len[p]+;
memcpy(ch[nq],ch[q],sizeof(ch[nq]));
fa[nq]=fa[q]; link(nq,fa[q]);
fa[q]=fa[np]=nq;
cut(q); link(q,nq); link(np,nq);
for(;ch[p][c]==q;p=fa[p]) ch[p][c]=nq;
}
}
last=np;
} void build()
{
scanf("%s",s+);
int n=strlen(s+);
for(int i=;i<=n;++i) extend(s[i]-'A');
} void add()
{
decodeWithMask(mask);
int n=chars.length();
for(int i=;i<n;++i) extend(chars[i]-'A');
} int query()
{
decodeWithMask(mask);
int n=chars.length();
int now=;
for(int i=;i<n;++i)
if(!(now=ch[now][chars[i]-'A'])) return ;
splay(now);
return sum[now];
} int main()
{
int T,ans;
scanf("%d",&T);
build();
while(T--)
{
scanf("%s",s);
if(s[]=='A') add();
else
{
ans=query();
printf("%d\n",ans);
mask^=ans;
}
}
}
bzoj千题计划285:bzoj2555: SubString的更多相关文章
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
- bzoj千题计划177:bzoj1858: [Scoi2010]序列操作
http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...
- bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...
- bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...
- bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹
http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...
- bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机
http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...
- bzoj千题计划250:bzoj3670: [Noi2014]动物园
http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...
随机推荐
- effective c++ 笔记 (23-25)
//---------------------------15/04/08---------------------------- //#23 宁以non_member.non_friend替换m ...
- Gulp:插件编写入门
之前挖了个坑,准备写篇gulp插件编写入门的科普文,之后迟迟没有动笔,因为不知道该肿么讲清楚Stream这货,毕竟,gulp插件的实现不像grunt插件的实现那么直观. 好吧,于是决定单刀直入了.文中 ...
- NX 栈不可执行的绕过方式--ROP链
目标程序下载 提取码:5o0a 环境:Ubuntu linux 工具 pwn-gdb pwntools python库 ROPgadget ( 这些工具可以到github官网找) 1.检查程序开了哪些 ...
- 金蝶盘点机PDA仓库条码管理:仓库如何盘点
1.1. 仓库盘点 传统的仓库盘点,需要人工手工抄写盘点单,时候再去电脑上一行行的录入盘点单,操作非常耗时费力,往往需要盘点好几天,最终盘点效果还不好,在抄写过程中容易出现错误,从而造成盘点结果不准确 ...
- [转载]JVM 垃圾回收机制(Garbage Collection)
相关算法: 引用计数法 引用可达法 尚学堂 参考:http://www.sxt.cn/Java_jQuery_in_action/Principle_and_algorithm_of_garbage_ ...
- 一篇带你读懂TCP之“滑动窗口”协议
前言 你现在的努力,是为了以后有更多的选择. 在上一篇文章通过"表白"方式,让我们快速了解网络七层协议了解了网络七层协议. 接下来我们要把重心放在网络传输的可靠性上面.一起来看TC ...
- Vue 路由详解
Vue 路由详解 对于前端来说,其实浏览器配合超级连接就很好的实现了路由功能.但是对于单页面应用来说,浏览器和超级连接的跳转方式已经不能适用,所以各大框架纷纷给出了单页面应用的解决路由跳转的方案. V ...
- 基于SSH框架的网上书店系统开发的质量属性
基于SSH框架的网上书店系统开发的质量属性 对于我的基于SSH框架的网上书店系统的开发要实现的质量属性有可用性.可修改性.性能.安全性.易用性和可测试性. 1.对于可用性方面的战术: 可用性(Avai ...
- 剑指offer:二叉搜索树的后续遍历序列
题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 解题思路: 根据二叉搜索的性质,后序遍历是先搜索 ...
- 05 方法与数组笔记【JAVA】
---恢复内容开始--- 1:方法(掌握) (1)方法:就是完成特定功能的代码块. 注意:在很多语言里面有函数的定义,而在Java中,函数被称为方法. (2)格式: 修饰符 返回值类型 方法名(参数类 ...