BZOJ2555:SubString——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=2555
(1):在当前字符串的后面插入一个字符串(2):询问字符串s在当前字符串中出现了几次?(作为连续子串)你必须在线支持这些操作。
参考:https://www.cnblogs.com/zcysky/p/6851553.html
动态加字符串很容易想到后缀自动机。
如果暴力更新size(或者叫right?)以前是能过的,现在过不了。
但其实parent树本身就是树,用lct维护一下就可做了。
(树根和朝向一定所以不用rev当然用了也没人拦你。)
(很gg,更新lct需要打标记pushdown而不是upt,cut的节点也不要搞错了。)
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
typedef long long ll;
const int N=;
struct tree{
int a[],fa,l;
}ti[N];
char s[],ch[];
int last,cnt;
int a[N],w[N],size[N],tag[N];
int n,m,r,fa[N],tr[N][],q[N];
inline void add(int x,int y){if(x)tag[x]+=y,size[x]+=y;}
inline bool get(int x){
return tr[fa[x]][]==x;
}
inline bool isroot(int x){
if(!fa[x])return ;
return tr[fa[x]][]!=x&&tr[fa[x]][]!=x;
}
inline void push(int x){
if(!tag[x])return;
add(tr[x][],tag[x]);
add(tr[x][],tag[x]);
tag[x]=;
}
inline void rotate(int x){
int y=fa[x],z=fa[y],which=get(x);
if(z&&!isroot(y))tr[z][tr[z][]==y]=x;
tr[y][which]=tr[x][which^];fa[tr[y][which]]=y;
fa[y]=x;tr[x][which^]=y;fa[x]=z;
}
inline void splay(int x){
q[r=]=x;
for(int y=x;!isroot(y);y=fa[y])q[++r]=fa[y];
for(int i=r;i>=;i--)push(q[i]);
while(!isroot(x)){
if(!isroot(fa[x]))
rotate((get(x)==get(fa[x])?fa[x]:x));
rotate(x);
}
}
inline void access(int x){
for(int y=;x;y=x,x=fa[x]){
splay(x);tr[x][]=y;
if(y)fa[y]=x;
}
}
inline void link(int x,int y){
fa[x]=y;access(y);splay(y);add(y,size[x]);
}
inline void cut(int x){
access(x);splay(x);add(tr[x][],-size[x]);
fa[tr[x][]]=;tr[x][]=;
}
inline void insert(int c){
int p=last,np=++cnt;
last=np;ti[np].l=ti[p].l+;size[np]=;
for(;p&&!ti[p].a[c];p=ti[p].fa)ti[p].a[c]=np;
if(!p){
ti[np].fa=;
link(np,);
}
else{
int q=ti[p].a[c];
if(ti[p].l+==ti[q].l){
ti[np].fa=q;
link(np,q);
}
else{
int nq=++cnt;ti[nq].l=ti[p].l+;
memcpy(ti[nq].a,ti[q].a,sizeof(ti[q].a));
cut(q);
link(nq,ti[q].fa);link(q,nq);link(np,nq);
ti[nq].fa=ti[q].fa;ti[q].fa=ti[np].fa=nq;
for(;p&&ti[p].a[c]==q;p=ti[p].fa)ti[p].a[c]=nq;
}
}
}
inline int query(int len){
int now=;
for(int i=;i<len;i++){
if(ti[now].a[s[i]-'A']){
now=ti[now].a[s[i]-'A'];
}else return ;
}
access(now);splay(now);
return size[now];
}
int main(){
last=cnt=;
int q,mask=,len,res;
scanf("%d%s",&q,s);
len=strlen(s);
for(int i=;i<len;i++)insert(s[i]-'A');
while(q--){
scanf("%s%s",ch,s);
len=strlen(s);res=mask;
for(int i=;i<len;i++){
res=(res*+i)%len;
swap(s[i],s[res]);
}
if(ch[]=='A'){
for(int i=;i<len;i++)insert(s[i]-'A');
}else{
int tmp=query(len);
printf("%d\n",tmp);
mask^=tmp;
}
}
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
BZOJ2555:SubString——题解的更多相关文章
- BZOJ2555 SubString【SAM + Link Cut Tree】
BZOJ2555. SubString 要求在线询问一个串在原串中出现的次数,并且可以在原串末尾添加字符串 如果没有修改的话,考虑建出\(parent\)树之后统计每个\(endpos\)节点的\(r ...
- bzoj2555: SubString sam+lct
题意:懒得写背景了,给你一个字符串init,要求你支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 你必须在线支持这些操作. 题解 ...
- [LeetCode]Longest Palindromic Substring题解(动态规划)
Longest Palindromic Substring: Given a string s, find the longest palindromic substring in s. You ma ...
- [BZOJ2555]SubString LCT+后缀自动机
2555: SubString Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 3253 Solved: 975[Submit][Status][Di ...
- BZOJ2555 SubString 【后缀自动机 + LCT】
题目 懒得写背景了,给你一个字符串init,要求你支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 你必须在线支持这些操作. 输入 ...
- bzoj2555: SubString
SAM+LCT维护parent tree版本 虽然说子树维护那套理论需要ETT 不过parent tree的根是固定的,所以用lct加一些奇怪的乱搞就行了 //随手拖个SAM的板子和LCT的板子,然后 ...
- BZOJ2555——SubString
0.题目很短,就不概括了 给你一个字符串init,要求你支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 你必须在线支持这些操作. ...
- [NOIP2015] 子串substring 题解
[题目描述] 有两个仅包含小写英文字母的字符串A和B.现在要从字符串A中取出k个互不重叠的非空子串,然后把这k个子串按照其在字符串A中出现的顺序依次连接起来得到一个新的字符串,请问有多少种方案可以使得 ...
- 2019.03.01 bzoj2555: SubString(sam+lct)
传送门 题意简述: 要求在线支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 思路: 考虑用lctlctlct来动态维护samsa ...
随机推荐
- Spring Boot 示例项目
Spring Boot 基于注解式开发 maven REST 示例项目 项目地址:https://github.com/windwant/spring-boot-service 项目地址: ...
- python 终极篇 --- form组件 与 modelForm
form组件 ...
- python程序设计——面向对象程序设计:类
理解面向对象 基本原则是,计算机程序由多个能够起到子程序作用的单元或对象组合而成 关键性观念是,数据以及对数据的操作封装在一起,组成一个相互依存.不可分割的整体,即对象 python面向对象特性 完全 ...
- [Clr via C#读书笔记]Cp14字符字符串和文本处理
Cp14字符字符串和文本处理 字符 System.Char结构,2个字节的Unicode,提供了大量的静态方法:可以直接强制转换成数值: 字符串 使用最频繁的类型:不可变:引用类型,在堆上分配,但是使 ...
- tendermint学习
怎么把两个节点变成验证节点 1. 两个节点分别启动 2. 两个节点同时把自己的公钥信息添加到对方的创始快配置文件中,总而言之,创始块一样 3. unsafe_reset_priv_validator ...
- 一键部署 Docker Datacenter ---简化docker数据中心安装步骤
DDC 简介 2016年2月下旬,Docker发布了企业级容器管理和服务部署的整体解决方案平台-Docker Datacenter,简称DDC.DDC 有三个组件构成:1. Docker Univer ...
- HADOOP docker(二):HDFS 高可用原理
1.环境简述2.QJM HA简述2.1为什么要做HDFS HA?2.2 HDFS HA的方式2.2 HSFS HA的结构2.3 机器要求3.部署HDFS HA3.1 详细配置3.2 部署HDF ...
- Thunder团队第一周 - Scrum会议4
Scrum会议4 小组名称:Thunder 项目名称:爱阅app Scrum Master:代秋彤 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李传 ...
- 如何用vs查看框架函数管道模型
调试状态下 函数调用的 代码图,我们可以看到MVC框架的函数管道模型 源文章标题: 源文章:https://www.cnblogs.com/1996V/p/9037603.html 扩展阅读:http ...
- 数据库集群之路二 MYCAT
windows下安装配置并使用mycat 参考:http://www.cnblogs.com/parryyang/p/5758087.html 一 下载windows版本 https://github ...