/*
动态求right集合的大小
LCT维护parent树即可
注意 由于树是有向的不会换根并且每次操作单一, 于是不需要维护子树和(写起来很麻烦)
直接打标记修改即可
*/ #include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
#define ll long long
#define M 1200010
#define mmp make_pair
using namespace std;
int read()
{
int nm = 0, f = 1;
char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';
return nm * f;
} int mask, ans;
struct Lct
{
#define ls ch[x][0]
#define rs ch[x][1]
int ch[M][2], rev[M], ver[M], fa[M], s[M];
bool isr(int x)
{
return ch[fa[x]][0] != x && ch[fa[x]][1] != x;
} void up(int x, int vv)
{
ver[x] += vv;
s[x] += vv;
} void pushdown(int x)
{
if(s[x])
{
up(ls, s[x]);
up(rs, s[x]);
s[x] = 0;
}
} void pd(int x)
{
if(!isr(x)) pd(fa[x]);
pushdown(x);
} void rotate(int x)
{
int y = fa[x], q = fa[y];
bool dy = (ch[y][1] == x), dz = (ch[q][1] == y);
if(!isr(y)) ch[q][dz] = x;
fa[x] = q;
fa[ch[x][dy ^ 1]] = y;
ch[y][dy] = ch[x][dy ^ 1];
ch[x][dy ^ 1] = y;
fa[y] = x;
} void splay(int x)
{
pd(x);
while(!isr(x))
{
int y = fa[x], q = fa[y];
if(!isr(y))
{
if((ch[y][1] == x) ^ (ch[q][1] == y))
{
rotate(x);
}
else rotate(y);
}
rotate(x);
}
} void access(int x)
{
for(int y = 0; x; y = x, x = fa[x]) splay(x), rs = y;
} void link(int x, int y)
{
fa[x] = y;
access(y);
splay(y);
up(y, ver[x]);
} void cut(int x)
{
access(x), splay(x), up(ls, -ver[x]), fa[ls] = 0, ls = 0;
}
}T; int ch[M][26], len[M], fa[M], lst = 1, cnt = 1; void insert(int c)
{
int p = ++cnt, f = lst;
lst = p;
len[p] = len[f] + 1;
T.ver[p] = 1;
while(f && !ch[f][c]) ch[f][c] = p, f = fa[f];
if(!f)
{
fa[p] = 1;
T.link(p, 1);
}
else
{
int q = ch[f][c];
if(len[q] == len[f] + 1)
{
T.link(p, q);
fa[p] = q;
}
else
{
int nq = ++cnt;
len[nq] = len[f] + 1;
memcpy(ch[nq], ch[q], sizeof(ch[nq]));
fa[nq] = fa[q];
T.link(nq, fa[q]);
fa[q] = fa[p] = nq;
T.cut(q);
T.link(q, nq);
T.link(p, nq);
while(f && ch[f][c] == q) ch[f][c] = nq, f = fa[f];
}
}
} char s[M * 3];
void work()
{
int mlgb = mask;
int l = strlen(s);
for(int i = 0; i < l; i++)
{
mlgb = (mlgb * 131 + i) % l;
swap(s[i], s[mlgb]);
}
// puts(s);
} int main()
{
int q = read();
scanf("%s", s + 1);
int l = strlen(s + 1);
for(int i = 1; i <= l; i++) insert(s[i] - 'A');
while(q--)
{
scanf("%s", s + 1);
if(s[1] == 'Q')
{
scanf("%s", s);
l = strlen(s);
work();
int now = 1;
for(int i = 0; i < l; i++) now = ch[now][s[i] - 'A'];
if(!now) ans = 0;
else
{
T.splay(now);
ans = T.ver[now];
}
cout << ans << "\n";
mask ^= ans;
}
else
{
scanf("%s", s);
l = strlen(s);
work();
for(int i = 0; i < l; i++) insert(s[i] - 'A');
}
}
return 0;
}
/*
2
BBABBBBAAB ADD BBBAAB QUERY BBA
*/

bzoj2555 substring(LCT 后缀自动机)的更多相关文章

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

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

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

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

  3. BZOJ2555: SubString(后缀自动机,LCT维护Parent树)

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

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

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

  5. BZOJ2555 SubString(后缀自动机+LCT)

    询问串放在SAM上不跳fail跑到的节点的|right|即为答案.用LCT维护parent树即可.可以直接维护子树信息,也可以转化为路径加.注意强制在线所使用的mask是作为参数传进去的. #incl ...

  6. 【BZOJ2555】SubString(后缀自动机,Link-Cut Tree)

    [BZOJ2555]SubString(后缀自动机,Link-Cut Tree) 题面 BZOJ 题解 这题看起来不难 每次要求的就是\(right/endpos\)集合的大小 所以搞一个\(LCT\ ...

  7. spoj 7258 Lexicographical Substring Search (后缀自动机)

    spoj 7258 Lexicographical Substring Search (后缀自动机) 题意:给出一个字符串,长度为90000.询问q次,每次回答一个k,求字典序第k小的子串. 解题思路 ...

  8. 【SPOJ】Longest Common Substring(后缀自动机)

    [SPOJ]Longest Common Substring(后缀自动机) 题面 Vjudge 题意:求两个串的最长公共子串 题解 \(SA\)的做法很简单 不再赘述 对于一个串构建\(SAM\) 另 ...

  9. bzoj 2555: SubString【后缀自动机+LCT】

    一直WA--找了半天错的发现居然是解密那里的mask其实是不能动的--传进去的会变,但是真实的那个不会变-- 然后就是后缀自动机,用LCT维护parent树了--注意不能makeroot,因为自动机的 ...

随机推荐

  1. [转]从OSI网络模型到TCP/IP协议族简介

    OSI七层模型 OSI(Open System Interconnection,开放系统互联)七层网络模型成为开放式系统互联参考模型,是一个把网络通信在逻辑上的定义,也可以理解成为定义了通用的网络通信 ...

  2. 在浏览器中输入url回车之后会发生什么

    在浏览器中输入URL之后,浏览器会经历以下5个步骤: 1.解析URL 2.DNS域名解析 3.浏览器与网站建立TCP链接(三次握手) 4.请求和传输数据 5.浏览器渲染页面 一.解析URL 什么是ur ...

  3. MySQL 遇到错误集锦

    MySQL 规定:varchar必须指定长度,否则报错:ERROR 1064 (42000) 只有一列时,primary key 直接写在这一列的后面: 没有定义主键时,提示错误:ERROR 1075 ...

  4. 关于plot画图的原理

    首先是导入的: Import matplotlib.pyplot as plt 这份导入要背住,没事就是需要你进行导入的: 然后就是画图了,下面举一个例子: import numpy as np im ...

  5. MySQL命令行下执行sql文件(sql脚本)

    在mysql命令行下执行sql文件(sql脚本) mysql> source    sql文件完整路径 如: mysql> source   D:\\MySQL\\create.sql 文 ...

  6. 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

    问题 rds_content = "{}, 执行了变更,sql语句:{}".format(ExecuteTime, sqls) 'ascii' codec can't encode ...

  7. InfluxDB(官方使用说明)

    安装InfluxDB OSS 此页面提供有关安装,启动和配置InfluxDB的说明. InfluxDB OSS安装要求 root为了成功完成,需要安装InfluxDB软件包或具有管理员权限. Infl ...

  8. webGL之three.js入门3--材料篇

    这几天在看李鹏程翻译的[美]Jos Dirksen的<Three.js开发指南>,看到第八章了,现在来总结一下threejs中材料的相关知识.顺带也看完了上海交大的张雯莉出的<thr ...

  9. xftp找不到匹配的outgoing encryption 算法 怎么解决

    alert("找不到匹配的outgoing encryption 算法"); 原因,是ssh登录本地终端缓存了相关的安全确认信息: 远端的ssh服务升级后,其对应的加密算法均作了升 ...

  10. ALGO-18_蓝桥杯_算法训练_单词接龙(搜索)

    问题描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...