Description

懒得写背景了,给你一个字符串init,要求你支持两个操作
(1):在当前字符串的后面插入一个字符串
(2):询问字符串s在当前字符串中出现了几次?(作为连续子串)
你必须在线支持这些操作。

Solution

思路比较直观啊
首先没有插入的话,预处理好每个点 \(|right|\) 就好了
如果有插入的话我们发现实际上就是维护一个子树大小
每一次插入一个节点就相当于把父亲到根路径上的权值全部 \(+1\)
我们用 \(LCT\) 维护这个加边删边和路径加法的操作
每一次询问就是先找到这个串对应的节点 \(x\),如果没找到答案就是 \(0\),否则就是 \(|Right_x|\) 了

这题是有根树,不需要 \(makeroot\) 操作,写起来比较舒服

#include<bits/stdc++.h>
using namespace std;
const int N=2e6+10;
namespace LCT{int ch[N][2],fa[N],la[N],w[N];inline bool isrt(int x){return ch[fa[x]][0]!=x && ch[fa[x]][1]!=x;}inline void mark(int x,int t){la[x]+=t;w[x]+=t;}inline void pushdown(int x){if(!la[x])return ;mark(ch[x][0],la[x]);mark(ch[x][1],la[x]);la[x]=0;}inline void rotate(int x){int y=fa[x];bool t=ch[y][1]==x;ch[y][t]=ch[x][!t];fa[ch[y][t]]=y;ch[x][!t]=y;fa[x]=fa[y];if(!isrt(y))ch[fa[y]][ch[fa[y]][1]==y]=x;fa[y]=x;}inline void Push(int x){if(!isrt(x))Push(fa[x]);pushdown(x);}inline void splay(int x){Push(x);while(!isrt(x)){int y=fa[x],p=fa[y];if(isrt(y))rotate(x);else if((ch[p][0]==y)==(ch[y][0]==x))rotate(y),rotate(x);else rotate(x),rotate(x);}}inline void access(int x){int y=0;while(x)splay(x),ch[x][1]=y,x=fa[y=x];}inline void link(int x,int y){fa[x]=y;access(y);splay(y);splay(x);mark(y,w[x]);}inline void cut(int x){access(x);splay(x);mark(ch[x][0],-w[x]);fa[ch[x][0]]=0;ch[x][0]=0;}inline int query(int x){splay(x);return w[x];}
}
char s[N],op[10];int Q,mask=0;
inline void decode(){int len=strlen(s),t=mask;for(int j=0;j<len;j++){t=(t*131+j)%len;swap(s[j],s[t]);}
}
int ch[N][27],fa[N],len[N],cur=1,cnt=1;
inline void ins(int c){int p=cur;cur=++cnt;len[cur]=len[p]+1;LCT::w[cur]=1;for(;p && !ch[p][c];p=fa[p])ch[p][c]=cur;if(!p)fa[cur]=1,LCT::link(cur,1);else{int q=ch[p][c];if(len[q]==len[p]+1)fa[cur]=q,LCT::link(cur,q);else{int nt=++cnt;len[nt]=len[p]+1;memcpy(ch[nt],ch[q],sizeof(ch[q]));LCT::cut(q);LCT::link(nt,fa[q]);LCT::link(q,nt);LCT::link(cur,nt);fa[nt]=fa[q];fa[q]=fa[cur]=nt;for(;p && ch[p][c]==q;p=fa[p])ch[p][c]=nt;}}
}
inline int solve(int len){int p=1;for(int i=0;i<len;i++){int c=s[i]-'A';if(ch[p][c])p=ch[p][c];else return 0;}return LCT::query(p);
}
int main(){freopen("pp.in","r",stdin);freopen("pp.out","w",stdout);cin>>Q;scanf("%s",s);for(int i=0,le=strlen(s);i<le;i++)ins(s[i]-'A');while(Q--){scanf("%s%s",op,s);decode();int len=strlen(s),la;if(op[0]=='A')for(int i=0;i<len;i++)ins(s[i]-'A');else printf("%d\n",la=solve(len)),mask^=la;}return 0;
}

转载于:https://www.cnblogs.com/Yuzao/p/8762560.html

bzoj 2555: SubString相关推荐

  1. BZOJ 2555: SubString [后缀自动机 LCT]

    2555: SubString Time Limit: 30 Sec  Memory Limit: 512 MB Submit: 2045  Solved: 583 [Submit][Status][ ...

  2. [BZOJ 2555] SubString

    Substring 题意 题面 给定一个初始字符串, 要求支持在这个字符串后添加字符串/查询某个字符串作为子串的出现次数. 强制在线. 长度 \(\le600000\),询问次数 \(\le10000 ...

  3. [bzoj 2555]Substring

    传送门 Description 给你一个字符串\(init\),要求你支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 你必须在线 ...

  4. BZOJ.2555.SubString(后缀自动机 LCT)

    题目链接 \(Description\) 给你一个字符串init,要求支持两个操作: (1)在当前字符串的后面插入一个字符串s (2)询问字符串s在当前字符串中出现了几次(作为连续子串) 强制在线. ...

  5. qt string内带变量_QT QString 很全的使用 (转)

    QString, QByteArray, 和 QVariant这三个类和容器有许多相同之处,并且在一些情况下可以被当作特殊的容器. 同样,像容器,这些类使用隐式共享来优化内存和速度. 我们将从QStr ...

  6. 做题记录 To 2019.2.13

    2019-01-18 4543: [POI2014]Hotel加强版:长链剖分+树形dp. 3653: 谈笑风生:dfs序+主席树. POJ 3678 Katu Puzzle:2-sat问题,给n个变 ...

  7. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

  8. 后缀自动机/回文自动机/AC自动机/序列自动机----各种自动机(自冻鸡) 题目泛做...

    题目1 BZOJ 3676 APIO2014 回文串 算法讨论: cnt表示回文自动机上每个结点回文串出现的次数.这是回文自动机的定义考查题. 1 #include <cstdlib> 2 ...

  9. BZOJ4768: 2555加强版之wxh loves substring

    很显然的后缀平衡树 一开始以为要可持久化 发现根本不用.. treap的常数要死人啊? 我好像T光光了? 寄刀片寄刀片 #include<cstdio> #include<iostr ...

  10. bzoj4768: wxh loves substring //后缀平衡树

    bzoj4768: 2555加强版之wxh loves substring 题意 给出一个字符串,要求资瓷: 在末尾添加/删除字符: 询问一个串的出现次数. 原串长与变化长度之和<=800000 ...

最新文章

  1. CentOS安装Java JDK
  2. 机房批量改计算机名计算机组,批量设置IP地址和计算机名
  3. 详解struts2中struts.properties
  4. ADO.NET实用经验 转载
  5. PHP命名空间学习笔记
  6. 第9章 项目人力资源管理
  7. [tensorflow]tensorflow 顺序模型(Sequential model)
  8. Singleton模式的.NET实现
  9. php文件上传实验总结,php文件上传总结 - osc_jjc36t9p的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. 小刘的BUG(json插件)
  11. jq富文本_jQuery富文本编辑器Notebook
  12. java/php/net/python志愿者管理系统程序设计
  13. 黑苹果 macOS 无法修复磁盘 XXX 已修复
  14. 大数据背景下的信息资源管理
  15. 嵌入式软件面试题整理
  16. vscode setting 配置
  17. 趣谈人工智能——深度AI科普调研团队
  18. 计算机网络 两类密码体制
  19. Mina过滤器链原理
  20. 十大布局智慧城市生态的跨国巨头

热门文章

  1. php用date表示本月,用php获取本周,上周,本月,上月,本季度日期的代码
  2. python爬虫cookie池搭建_爬虫——cookies池的搭建
  3. inline-block的几个问题(还没解决)
  4. Linux系统编程—— fork() 函数详解
  5. Mac使用VMware、Ubuntu安装配置虚拟机Linux
  6. 实现nav_微信小程序——沉浸式导航栏实现(含iphoneX适配和组件封装)
  7. velocity 获取list对象_Redis专题2:认识list、Zset与BitMaps
  8. MyBatis集合Spring(二)之SqlSession
  9. 【渝粤教育】广东开放大学 建筑设备 形成性考核 (33)
  10. 谷歌大脑阿尔伯塔联合发表:离线强化学习的优化视角【附代码】