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 ...
随机推荐
- 微信小程序学习笔记(1)-微信小程序样式设置逻辑
1.微信小程序的样式设置统一在每一页的.wxss的样式文件中,所有的样式设置代码统一写入这个文件中: 2.样式主要是通过.wxml里面控件的“class”属性来调用,此处调用会有几个细节要注意: 1) ...
- 使用nmon监控得出网络实时速度以及最大、最小、平均网络传送速度
首先我们得搞清楚几个概念,即什么是网速?什么是带宽? 举两个个例子: 1.家里装网线,宽带提供商说我们的带宽是100兆. 2.用迅雷下载电影,迅雷显示实时的下载速度是每秒3兆,或者说是3MB/s. 这 ...
- 「日常训练」 Yukari's Birthday(ZOJ-3665)
题意与分析 二分题.考虑到n的范围是\(10^{12}\),注意到等比公式\(S=a_1\frac{1-q^n}{1-q} (q\ne 1)\),可以看出,不论q有多大(1除外,这个时候\(r=1,k ...
- Appium最新的服务器初始化参数(Capability)【截止11月29日,后续最新的可以看github】
键 描述 值 automationName 自动化测试的引擎 Appium (默认)或者 Selendroid platformName 使用的手机操作系统 iOS, Android, 或者 Fire ...
- lesson 21 Daniel Mendoza
lesson 21 Daniel Mendoza bare 赤裸的 :boxers fought with bare fists crude 天然的:crude sugar, crude oil 粗俗 ...
- sqlalchemy 转json 的几种常用方式
sqlalchemy 转json 的几种常用方式 # -*- coding:utf-8 -*- import datetime from flask import Flask, json, jsoni ...
- (查找函数+atoi)判断与(注册函数+strcmp函数)判断两种方法
loadrunner中接口判断的2中方法 如下: 1. ●查找函数web_reg_find() ● atoi():将字符串转换为整型值 作比较 > 0 Action() { //检查点函 ...
- 传入中文参数-->服务器_转码的方法
如果要传入 中文参数到 服务器 使用lr_convert_string_encoding() LR_ENC_SYSTEM_LOCALE , 转为 ...
- CPU设计学习-流水线
各种名词 标量流水线 超级流水线 超标量流水线与多发射技术 经典五级流水线 IF |Instruction Fetch,取指 ID |Instruction Decode,译码 EX |Execute ...
- 小米 OJ 编程比赛 02 月常规赛
Carryon 数数字 描述 Carryon 最近迷上了数数字,然后 Starry 给了他一个区间[l,r] ,然后提了几个要求, 需要将 ll 到 rr 之间的数全部转化成 16 进制,然后连起来. ...