传送门

Description

给你一个字符串\(init\),要求你支持两个操作

(1):在当前字符串的后面插入一个字符串

(2):询问字符串s在当前字符串中出现了几次?(作为连续子串)

你必须在线支持这些操作。

Solution

一个字符串出现的次数\(=\)它所对应的\(Right\)集合的大小\(=\)它在\(parent\)树上的孩子的\(Right\)集合的大小之和

在本题中,我们需要动态的维护\(parnet\)树的形态,而这个是可以通过\(LCT\)实现的

对于\(val\)值的修改,我们发现每次加点或删点都会影响一条到根路径上的所有点

我们发现路径都是到根的,所以,这里的\(LCT\)就不需要\(makeroot\)操作了

修改,是通过\(lazy\)标记实现哒

Code

/**************************************************************Problem: 2555User: PaperCloudLanguage: C++Result: AcceptedTime:14492 msMemory:163144 kb
****************************************************************/#include<cstring>
#include<cstdio>
#include<algorithm>
#define get(x) (c[fa[x]][1]==x)
#define MS 3000005
#define MX 1200005
char s[MS];
int L,val[MX],lazy[MX];
int fa[MX],c[MX][2];
inline void upd(int x,int v)
{if(!x)return;val[x]+=v;lazy[x]+=v;
}
inline void down(int x)
{if(!lazy[x])return;upd(c[x][0],lazy[x]);upd(c[x][1],lazy[x]);lazy[x]=0;
}
inline bool nrt(int x)
{return c[fa[x]][1]==x||c[fa[x]][0]==x;
}
inline void rotate(int x)
{int y=fa[x],z=fa[y],l=get(x),r=l^1;if(nrt(y))c[z][get(y)]=x;fa[x]=z;fa[c[x][r]]=y;c[y][l]=c[x][r];fa[y]=x;c[x][r]=y;
}
inline void Splay(int x)
{static int q[MX],top;q[top=1]=x;register int i;for(i=x;nrt(i);i=fa[i]) q[++top]=fa[i];for(;top;--top) down(q[top]);for(;nrt(x);rotate(x)) if(nrt(fa[x])) rotate(get(x)^get(fa[x])?x:fa[x]);
}
inline void access(int x)
{register int i;for(i=0;x;x=fa[i=x]) Splay(x),c[x][1]=i;
}
inline void cut(int x)
{access(x);Splay(x);upd(c[x][0],-val[x]);fa[c[x][0]]=0;c[x][0]=0;
}
inline void link(int x,int y)
{fa[x]=y;access(y);Splay(y);upd(y,val[x]);
}
inline void update(int x)
{if(!x)return;Splay(x);
}
int fail[MX],ss[MX][26],step[MX];
int last,cnt;
inline void Insert(int x)
{int p=last,np=++cnt;step[np]=step[p]+1;val[np]=1;for(;p&&!ss[p][x];p=fail[p]) ss[p][x]=np;if(!p)link(np,1),fail[np]=1;else{int q=ss[p][x];if(step[q]==step[p]+1)link(np,q),fail[np]=q;else{int nq=++cnt;step[nq]=step[p]+1;memcpy(ss[nq],ss[q],sizeof ss[q]);link(nq,fail[q]);cut(q);link(q,nq);link(np,nq);fail[nq]=fail[q];fail[q]=fail[np]=nq;for(;ss[p][x]==q;p=fail[p]) ss[p][x]=nq;}}last=np;
}
inline int Query(char *s,int L)
{register int i,x=1;for(i=0;i<L;++i) x=ss[x][s[i]-'A'];update(x);return val[x];
}
int mask=0;
int main()
{last=cnt=1;int i,q,lastans=0;scanf("%d%s",&q,s+1);L=strlen(s+1);for(i=1;i<=L;++i) Insert(s[i]-'A');char opt[10];while(q--){scanf("%s%s",opt,s);L=strlen(s);int mk=mask;for(i=0;i<L;++i) mk=(mk*131+i)%L,std::swap(s[i],s[mk]);if(opt[0]=='A') for(i=0;i<L;++i) Insert(s[i]-'A');else printf("%d\n",lastans=Query(s,L)),mask^=lastans;}return 0;
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

转载于:https://www.cnblogs.com/PaperCloud/p/10345681.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(后缀自动机 LCT)

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

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

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

  5. 做题记录 To 2019.2.13

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

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

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

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

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

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

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

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

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

最新文章

  1. 构造方法与重载:定义一个网络用户类,信息有用户 ID、用户密码、 email 地址。在建立类的实例时把以上三个信息都作为构造函数的参数输入
  2. 基于springboot2.x集成缓存注解及设置过期时间
  3. LOJ116 有源汇有上下界最大流(上下界网络流)
  4. 计算机二级access选择题技巧,计算机二级access考试注意事项及解题技巧策略
  5. ibatis mysql 同时删多个表报错_MySQL中Multiple primary key defined报错的解决办法
  6. POI写Word换行
  7. HCIE-Security Day6:5个实验深入浅出理解源NAT
  8. python 功能代码是什么_Python功能代码
  9. JSP项目实战视频教程
  10. Mac 锁屏的各种方法
  11. IEEE会议或期刊检索方法
  12. Pandas DataFrame为什么弃用.ix【个人看法】
  13. 快来和网红 ChatGPT 聊天!!
  14. Typora入门教学
  15. php生成字母头像,Identicon:实现根据用户账号生成像素头像php版
  16. 让自己更积极、阳光、拼搏、向上的方法
  17. [面经]美团 后端 offer√
  18. h5游戏接入googleplay时遇到的问题总结
  19. th themlefy 计算_航程计算的数学模型
  20. 除了MySQL数据库,你还要了解的一些数据库

热门文章

  1. boost::log模块实现如何同时对多个文件执行日志记录的测试程序
  2. GDCM:扫描包含DICOM文件的目录的测试程序
  3. boost::core模块实现交换string
  4. VTK:可视化之FastSplatter
  5. VTK:PolyData之TriangleArea
  6. OpenGL绘制带有索引的矩形的实例
  7. OpenGL立方体的纹理
  8. c++语句和流程控制
  9. 经典C语言程序100例之七六
  10. 24.volatile关键字的作用、volatile原理、可见性、内存屏障、volatile性能、transient