【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 ...
随机推荐
- 解决 sun.security.validator.ValidatorException: PKIX path building failed
今天用java HttpClients写爬虫在访问某Https站点报如下错误: sun.security.validator.ValidatorException: PKIX path buildin ...
- Date、String、Calendar相互转化
Date是在Jdk1.0出现的专门用来处理时间的类,但是由于Date在国际化方面存在限制,在Jdk1.1推出Calendar,现在Date的很多方法都已经过时,都迁移到Calendar上. 1.Dat ...
- Codeforces Round #419 (Div. 2) A-E
上紫啦! E题1:59压哨提交成功翻盘 (1:00就做完了调了一个小时,还好意思说出来? (逃)) 题面太长就不复制了,但是配图很可爱所以要贴过来 九条可怜酱好可爱呀 A - Karen and Mo ...
- 【CodeForces】679 B. Bear and Tower of Cubes
[题目]B. Bear and Tower of Cubes [题意]有若干积木体积为1^3,2^3,...k^3,对于一个总体积X要求每次贪心地取<=X的最大积木拼上去(每个只能取一次)最后总 ...
- 【洛谷 P3191】 [HNOI2007]紧急疏散EVACUATE(二分答案,最大流)
题目链接 sb错误调了3hour+.. bfs预处理出每个\(.\)到每个\(D\)的最短距离. 二分时间\(t\),把每个\(D\)拆成\(t\)个点,这\(t\)个点两两连边,流量\(INF\)表 ...
- 【洛谷 P3338】 [ZJOI2014]力(FFT)
题目链接 \[\Huge{E_i=\sum_{j=1}^{i-1}\frac{q_j}{(i-j)^2}-\sum_{j=i+1}^{n}\frac{q_j}{(i-j)^2}}\] 设\(A[i]= ...
- [整理] magento搬家
将原来网站文件中的var文件中的cache和session文件删除,将media中的缓存文件删除.然后将所有文件制作成一个压缩包,以减少文件体积,方便转移. 将压缩包转移到新的服务器域名指向的文件夹, ...
- hdu 1498 50 years, 50 colors(二分匹配_匈牙利算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1498 50 years, 50 colors Time Limit: 2000/1000 MS (Ja ...
- 设计模式之Composite
设计模式总共有23种模式这仅仅是为了一个目的:解耦+解耦+解耦...(高内聚低耦合满足开闭原则) Composite定义? 将对象以树形结构组织起来,以达成“部分-整体” 的层次结构. 想到Compo ...
- iTextSharp之pdfRead(两个文件文本内容的比较,指定页数的pdf截取,水印的添加)
using iTextSharp.text; using iTextSharp.text.pdf; using iTextSharp.text.pdf.parser; using System; us ...