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——题解的更多相关文章

  1. BZOJ2555 SubString【SAM + Link Cut Tree】

    BZOJ2555. SubString 要求在线询问一个串在原串中出现的次数,并且可以在原串末尾添加字符串 如果没有修改的话,考虑建出\(parent\)树之后统计每个\(endpos\)节点的\(r ...

  2. bzoj2555: SubString sam+lct

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

  3. [LeetCode]Longest Palindromic Substring题解(动态规划)

    Longest Palindromic Substring: Given a string s, find the longest palindromic substring in s. You ma ...

  4. [BZOJ2555]SubString LCT+后缀自动机

    2555: SubString Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 3253  Solved: 975[Submit][Status][Di ...

  5. BZOJ2555 SubString 【后缀自动机 + LCT】

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

  6. bzoj2555: SubString

    SAM+LCT维护parent tree版本 虽然说子树维护那套理论需要ETT 不过parent tree的根是固定的,所以用lct加一些奇怪的乱搞就行了 //随手拖个SAM的板子和LCT的板子,然后 ...

  7. BZOJ2555——SubString

    0.题目很短,就不概括了 给你一个字符串init,要求你支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 你必须在线支持这些操作. ...

  8. [NOIP2015] 子串substring 题解

    [题目描述] 有两个仅包含小写英文字母的字符串A和B.现在要从字符串A中取出k个互不重叠的非空子串,然后把这k个子串按照其在字符串A中出现的顺序依次连接起来得到一个新的字符串,请问有多少种方案可以使得 ...

  9. 2019.03.01 bzoj2555: SubString(sam+lct)

    传送门 题意简述: 要求在线支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 思路: 考虑用lctlctlct来动态维护samsa ...

随机推荐

  1. LOB类型的学习、总结

    LOB相关的概念 LOB类型: 将信息文件(十进制.二进制).图像甚至音频信息采用数据库作为保存载体时,就需要使用lob类型数据. 有两种Lob,Internal Lob和External Lob.I ...

  2. 微信小程序—day02

    全局配置 在app.json中,对小程序进行全局配置.官方文档 tabBar是对底部/顶部导航栏的配置,图片的icon 大小限制为40kb,建议尺寸为 81px * 81px 去阿里矢量图网站,找到图 ...

  3. MATLAB实现连续周期信号的频谱分析(正余弦波信号举例)

    关于MATLAB实现连续信号的频谱分析,以正余弦波信号频谱分析为例分析如下: 1.含有频率f ,2f和3f的正弦波叠加信号,即: 其中,f =500Hz.试采用Matlab仿真软件对该信号进行频谱分析 ...

  4. VBS简明教程

    VBS简明教程   一.输出 VBS的输出使用函数Msgbox调用对话框进行输出. Msgbox(message) Message为要输出的信息 二.输入 VBS的输入,调用函数Inputbox()进 ...

  5. 文本分类-TextCNN

    简介 TextCNN模型是由 Yoon Kim提出的Convolutional Naural Networks for Sentence Classification一文中提出的使用卷积神经网络来处理 ...

  6. mysql source 恢复 sql数据time_zone报错 已解决

    报了一些变量的错误,类似于"time_zone" 等错误 解决: [root@iz8vbilqy0q9v8tds55bqzz conf.d]# vi /etc/my.cnf [my ...

  7. Crawling is going on - Beta版本测试报告

    [Crawling is going on - Beta版本] 测试报告 文件状态: [] 草稿 [√] 正式发布 [] 正在修改 报告编号: 当前版本: 2.0.2 编写人: 周萱.刘昊岩.居玉皓 ...

  8. tomcat端口号修改

    修改Tomcat的端口号: 在默认情况下,tomcat的端口是8080,如果出现8080端口号冲突,用如下方法可以修改Tomcat的端口号: 首先: 在Tomcat的根(安装)目录下,有一个conf文 ...

  9. unity像素贪吃蛇

    [ 星 辰 · 别 礼 ] 设计过程: 首先,在之前玩坏控制台做的那个c#贪吃蛇之后,我以为做unity会很简单,但事实比较不如人意...拖了好几天.因为过程中遇到一些问题 蛇身的移动,还是用列表,将 ...

  10. 敏捷冲刺DAY3

    一. 每日会议 1. 照片 2. 昨日完成工作 3. 今日完成工作 登录界面的进一步完善 服务器搭建 建立数据库 下一步任务的规划,展望 4. 工作中遇到的困难 工作中的困难:在进行模糊查询时,由于中 ...