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的子节点 那么 ...
随机推荐
- Centos 7 安装mysql5.7.24二进制 版本
Mysql 二进制安装方法 下载mysql https://dev.mysql.com/downloads/mysql/ 1.解压包 tar xf mysql-5.7.24-linux-glibc2. ...
- js 二进制操作
//二进制保存var content = "file content!"; var data = new Blob([content],{type:"text/plain ...
- Unity3D工程全资源自动检测系统
是什么 这系统到底是个啥 本系统主要用于自动监测与检测各类型资源是否正常及满足指定规范,并在第一时间把出现的问题输出到控制台与保存到文件,以供对应的负责人及时修正. 为什么 你可能经常遇到的问题 资源 ...
- 20135202闫佳歆--week2 一个简单的时间片轮转多道程序内核代码及分析
一个简单的时间片轮转多道程序内核代码及分析 所用代码为课程配套git库中下载得到的. 一.进程的启动 /*出自mymain.c*/ /* start process 0 by task[0] */ p ...
- ElasticSearch 2 (4) - API Convention
ElasticSearch 2.1.1 (4) - API Convention The elasticsearch REST APIs are exposed using JSON over HTT ...
- 使用Samba服务程序,让linux系统之间共享文件
yum install -y cifs-utils mkdir /database 创建挂载目录 在root家目录创建认证文件(依次为SMB用户名.SMB用户密码.SMB共享域) v ...
- vmwear导出OVF模板解析(解决ovf导入服务器失败问题,虚拟机版本等)
我们将vmwear虚拟机导出ovf模板后,有三个文件: 1,.mf 保存着.ovf和.vmdk两个文件的SHA1值,用于校验文件的完整性 2,.ovf 以XML格式保存着虚拟机的配置信息 3,.vmd ...
- PHP filemtime() 函数
定义和用法 filemtime() 函数返回文件内容上次的修改时间. 若成功,则时间以 Unix 时间戳的方式返回.若失败,则返回 false. 语法 filemtime(filename) 参数 描 ...
- 页面用一个遮罩层显示加载,加载完后隐藏该div
<div id="background" class="background" style="display: none; "> ...
- Entity Framework(EF) Code First将实体中的string属性映射成text类型的几种方式
1.通过ColumnType属性设置 [Column(TypeName="text")] public string Text { get; set; } 在进行以上属性设置时,请 ...