【BZOJ 2555】 2555: SubString (SAM+LCT)
2555: SubString
Time Limit: 30 Sec Memory Limit: 512 MB
Submit: 2548 Solved: 762Description
懒得写背景了,给你一个字符串init,要求你支持两个操作
(1):在当前字符串的后面插入一个字符串
(2):询问字符串s在当前字符串中出现了几次?(作为连续子串)
你必须在线支持这些操作。
Input
第一行一个数Q表示操作个数
第二行一个字符串表示初始字符串init
接下来Q行,每行2个字符串Type,Str
Type是ADD的话表示在后面插入字符串。
Type是QUERY的话表示询问某字符串在当前字符串中出现了几次。
为了体现在线操作,你需要维护一个变量mask,初始值为0
读入串Str之后,使用这个过程将之解码成真正询问的串TrueStr。
询问的时候,对TrueStr询问后输出一行答案Result
然后mask = mask xor Result
插入的时候,将TrueStr插到当前字符串后面即可。HINT:ADD和QUERY操作的字符串都需要解压
Output
Sample Input
2A
QUERY B
ADD BBABBBBAAB
Sample Output
0HINT
40 % 的数据字符串最终长度 <= 20000,询问次数<= 1000,询问总长度<= 10000
100 % 的数据字符串最终长度 <= 600000,询问次数<= 10000,询问总长度<= 3000000
新加数据一组--2015.05.20
Source
【分析】
一开始都没想着用LCT,后来发现我的SAM的right数组一直都是要逆拓扑序求的。
在线的话,还要在线维护。把pre边看成一棵树,就是要支持link,cut操作的,求子树和的东西。
其实LCT我只会做路径的,不会做子树了。看了hzwer的代码。【然后好像是,其实也是维护了路径,就是link x和f 的时候就是把f到根的路径都加上val[x]
【ORZ欧颓果说用splay维护dfs序也可以啊?
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 600010
#define Maxl 3000010 struct node
{
int pre,son[],step;
}t[Maxn*]; struct nnode
{
int son[],fa,val,laz;
nnode() {son[]=son[]=fa=val=laz=;}
}tr[Maxn*]; char s[Maxl];
void init(int mask)
{
scanf("%s",s);
int l=strlen(s);
for(int i=;i<l;i++)
{
mask=(mask*+i)%l;
swap(s[i],s[mask]);
}
} struct lct
{
void add(int x,int y)
{
if(x) tr[x].val+=y,tr[x].laz+=y;
}
bool is_root(int x)
{
return tr[tr[x].fa].son[]!=x&&tr[tr[x].fa].son[]!=x;
}
bool pushdown(int x)
{
int lc=tr[x].son[],rc=tr[x].son[];
if(tr[x].laz)
{
add(lc,tr[x].laz);add(rc,tr[x].laz);
tr[x].laz=;
}
}
void rot(int x)
{
int fa=tr[x].fa,yy=tr[fa].fa;
int w=tr[tr[x].fa].son[]==x; if(!is_root(fa))
{
if(tr[yy].son[]==fa) tr[yy].son[]=x;
else tr[yy].son[]=x;
}tr[x].fa=yy; tr[fa].son[-w]=tr[x].son[w];
tr[tr[x].son[w]].fa=fa; tr[x].son[w]=fa;
tr[fa].fa=x;
//upd(fa);//upd(x);
}
int q[*Maxn];
void pre(int x)
{
int tp=;
while(!is_root(x)) q[++tp]=x,x=tr[x].fa;
q[++tp]=x;
for(int i=tp;i>=;i--) pushdown(q[i]);
}
void splay(int x)
{
pre(x);
while(!is_root(x))
{
int fa=tr[x].fa,yy=tr[fa].fa;
if(!is_root(fa))
{
if((tr[yy].son[]==fa)==(tr[fa].son[]==x)) rot(fa);
else rot(x);
}
rot(x);
}//upd(x);
}
void access(int x)
{
int t=;
while(x)
{
splay(x);
tr[x].son[]=t;
t=x;
x=tr[x].fa;
}
}
/*void split(int x,int y)
{
make_root(x);
access(y);
splay(y);
}*/
void link(int x,int f)
{
tr[x].fa=f;
access(f);
splay(f);
add(f,tr[x].val);
}
void cut(int x)
{
access(x);splay(x);
add(tr[x].son[],-tr[x].val);
tr[tr[x].son[]].fa=;
tr[x].son[]=;
}
}lct; int mask;
struct sam
{
int last,tot;
void extend(int k)
{
int np=++tot,p=last;
t[np].step=t[p].step+;
tr[np].val=;
while(p&&!t[p].son[k])
{
t[p].son[k]=np;
p=t[p].pre;
}
if(!p) t[np].pre=,lct.link(np,);
else
{
int q=t[p].son[k];
if(t[q].step==t[p].step+) t[np].pre=q,lct.link(np,q);
else
{
int nq=++tot;//upd(tot);
t[nq].step=t[p].step+;
memcpy(t[nq].son,t[q].son,sizeof(t[nq].son));
t[nq].pre=t[q].pre;
lct.link(nq,t[nq].pre);
t[q].pre=t[np].pre=nq;
lct.cut(q);lct.link(q,nq);lct.link(np,nq);
while(p&&t[p].son[k]==q)
{
t[p].son[k]=nq;
p=t[p].pre;
}
}
}
last=np;
}
void add()
{
init(mask);
int l=strlen(s);
for(int i=;i<l;i++) extend(s[i]-'A'+);
}
int query()
{
init(mask);
int nw=,l=strlen(s);
for(int i=;i<l;i++)
{
int ind=s[i]-'A'+;
if(!t[nw].son[ind]) return ;
nw=t[nw].son[ind];
}
lct.splay(nw);
return tr[nw].val;
}
}sam; char ss[]; int main()
{
int q;
scanf("%d",&q);
sam.tot=sam.last=;
scanf("%s",s);
int l=strlen(s);
for(int i=;i<l;i++) sam.extend(s[i]-'A'+);
while(q--)
{
scanf("%s",ss);
if(ss[]=='A') sam.add();
else
{
int ans=sam.query();
printf("%d\n",ans);
mask^=ans;
}
}
return ;
}
2017-04-19 07:48:14
【BZOJ 2555】 2555: SubString (SAM+LCT)的更多相关文章
- bzoj 2555 SubString(SAM+LCT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2555 [题意] 给定一个字符串,可以随时插入字符串,提供查询s在其中作为连续子串的出现 ...
- 【BZOJ 4170】 4170: 极光 (CDQ分治)
4170: 极光 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 121 Solved: 64 Description "若是万一琪露诺(俗 ...
- 【BZOJ 4527】 4527: K-D-Sequence (线段树)
4527: K-D-Sequence Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 145 Solved: 59 Description 我们称一个 ...
- 【BZOJ 2982】 2982: combination (卢卡斯定理)
2982: combination Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 510 Solved: 316 Description LMZ有n个 ...
- 【BZOJ 3262】 3262: 陌上花开 (CDQ分治)
3262: 陌上花开 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A ...
- 【bzoj 3333】排队计划(线段树)
n个数,求一次逆序对.接着有m次修改操作,把每次输入的位置p的数之后<=它的数取出来,从小到大排序后再放回空位里,求逆序对.(N,M<=500,000 , Ai<=10^9)思路:1 ...
- 2019.03.01 bzoj2555: SubString(sam+lct)
传送门 题意简述: 要求在线支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 思路: 考虑用lctlctlct来动态维护samsa ...
- 【BZOJ】4721: [Noip2016]蚯蚓 / 【洛谷】P2827 蚯蚓(单调队列)
Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮 ...
- 【LOJ#3097】[SNOI2019]通信(费用流)
[LOJ#3097][SNOI2019]通信(费用流) 题面 LOJ 题解 暴力就直接连\(O(n^2)\)条边. 然后分治/主席树优化连边就行了. 抄zsy代码,zsy代码是真的短 #include ...
随机推荐
- Plan
相册Gallery 标签页 Slide 播放器 Dialog 放大镜 http://sc.chinaz.com/info/130123265570.htm
- 56、isinstance作用以及应用场景?
isinstance作用:来判断一个对象是否是一个已知的类型: 其第一个参数(object)为对象,第二个参数为类型名(int...)或类型名的一个列表((int,list,float)是一个列表). ...
- div遮罩实现禁用鼠标(click、hover等)事件
这两天在帮老师做网页,今天想实现在一块区域内禁止鼠标的各种事件,本来是想在框架模板的js文件里去修改,但是改代码的时候有点凌乱...感觉应该自己把问题想复杂了. 所以想了想要是能实现在一个区域内(如: ...
- Coursera在线学习---第一节.梯度下降法与正规方程法求解模型参数比较
一.梯度下降法 优点:即使特征变量的维度n很大,该方法依然很有效 缺点:1)需要选择学习速率α 2)需要多次迭代 二.正规方程法(Normal Equation) 该方法可以一次性求解参数Θ 优点:1 ...
- NASA: A Closer View of the Moon(近距离观察月球)
Posted to Twitter by @Astro_Alex, European Space Agency astronaut Alexander Gerst, this image shows ...
- 搭建linux+nginx+mysql+php环境
yum install -y gcc gcc-c++ make zlib zlib-devel pcre pcre-devel libjpeg libjpeg-devel libpng libpn ...
- git@oschina.net源代码管理使用日记【转】
转自:https://www.cnblogs.com/Juvy/p/3556902.html git的优势: 1 可以创建分支: 2 版本控制是基于每一次提交的,而不需要考虑每次提交了多少个文件. 下 ...
- Android快速入门(转自 农民伯伯: http://www.cnblogs.com/over140/)
前言 这是前段时间用于公司Android入门培训的资料,学习Android三周时间收集整理的,时间仓促,希望能对像我这样还没入门就直接上项目的人一点帮助 :) 声明 欢迎转载,但请保留文章原始出处: ...
- 144.Binary Tree Preorder Traversal---二叉树先序、中序非递归遍历
题目链接 题目大意:返回二叉树的先序遍历list.中序见94,后序见145. 法一:普通递归遍历,只是这里多了一个list数组,所以分成了两个函数.代码如下(耗时1ms): public List&l ...
- 在flask中返回requests响应
在flask服务端,有时候需要使用requests请求其他url,并将响应返回回去.查阅了flask文档,About Responses,可以直接构造响应结果进行返回. If a tuple is r ...