bzoj2555(lct维护sam)
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
const int maxs=3e6; struct LCT
{
int ch[maxn+][],fa[maxn+],flip[maxn+];
int top;
int q[maxn+];
int sz[maxn+];
int tag[maxn+];
void init()
{ }
bool isroot(int x)
{
return ch[fa[x]][]!=x&&ch[fa[x]][]!=x;
}
void add(int x,int data)
{
if(x)
{
tag[x]+=data;
sz[x]+=data;
}
}
void pushdown(int x)
{
int l=ch[x][],r=ch[x][];
if(flip[x])
{
flip[x]^=;flip[l]^=;flip[r]^=;
swap(ch[x][],ch[x][]);
}
if(tag[x])
{
add(l,tag[x]),add(r,tag[x]);
tag[x]=;
}
}
void rotate(int &x)
{
int y=fa[x],z=fa[y],l,r;
if(ch[y][]==x) l=;
else l=;
r=l^;
if(!isroot(y))
{
if(ch[z][]==y) ch[z][]=x;
else ch[z][]=x;
}
fa[x]=z;fa[y]=x;fa[ch[x][r]]=y;
ch[y][l]=ch[x][r];ch[x][r]=y;
}
void splay(int &x)
{
top=;
q[++top]=x;
for(int i=x;!isroot(i);i=fa[i]) q[++top]=fa[i];
while(top) pushdown(q[top--]);
while(!isroot(x))
{
int y=fa[x],z=fa[y];
if(!isroot(y))
{
if(ch[y][]==x^ch[z][]==y) rotate(x);
else rotate(y);
}
rotate(x);
}
}
void access(int x)
{
for(int t=;x;t=x,x=fa[x])
splay(x),ch[x][]=t;
}
void link(int x,int f)
{
fa[x]=f;
access(f);
splay(f);
add(f,sz[x]);
}
void cut(int x)
{
access(x);
splay(x);
add(ch[x][],-sz[x]);
fa[ch[x][]]=,ch[x][]=;
}
int query(int x)
{
access(x);
splay(x);
return sz[x];
}
}lct; struct SAM
{
int maxlen[maxn+],minlen[maxn+],trans[maxn+][],slink[maxn+];
int sz,last;
void init()
{
for(int i=;i<;++i) trans[][i]=slink[]=-;
maxlen[]=minlen[]=;
sz=;
last=;
}
int build(int _maxlen,int _minlen,int* _trans,int _slink)
{
maxlen[++sz]=_maxlen;
minlen[sz]=_minlen;
for(int i=;i<;++i)
if(_trans==NULL) trans[sz][i]=-;else trans[sz][i]=_trans[i];
slink[sz]=_slink;
return sz;
}
int add(char ch,int u)
{
int c=ch-'A';
int z=build(maxlen[u]+,-,NULL,-);
lct.sz[z]=;
int v=u;
while(v!=-&&trans[v][c]==-)
{
trans[v][c]=z,v=slink[v];
}
if(v==-)//最简单的情况,suffix-path(u->S)上都没有对应字符ch的转移
{
minlen[z]=;
slink[z]=;
lct.link(z,);
return z;
}
int x=trans[v][c];
if(maxlen[v]+==maxlen[x])//较简单的情况,不用拆分x
{
minlen[z]=maxlen[x]+;
slink[z]=x;
lct.link(z,x);
return z;
}
int y=build(maxlen[v]+,-,trans[x],slink[x]); //最复杂的情况,拆分x,y表示<=maxlen[v]+1的那段
slink[y]=slink[x];
lct.link(y,slink[y]);
minlen[x]=maxlen[y]+;
lct.cut(x);
slink[x]=y;
lct.link(x,y);
minlen[z]=maxlen[y]+;
slink[z]=y;
lct.link(z,y);
int w=v;
while(w!=-&&trans[w][c]==x) trans[w][c]=y,w=slink[w];
minlen[y]=maxlen[slink[y]]+;
return z;
}
void append(char *s)
{
int len=strlen(s);
for(int i=;i<len;++i) last=add(s[i],last);
}
int query(char *s)
{
int len=strlen(s);
int now=;
for(int i=;i<len;++i)
{
now=trans[now][s[i]-'A'];
if(now==-) return ;
}
return lct.query(now);
}
}sam;
char s[maxs+];
int mask=;
void gets(int mask)
{
scanf("%s",s);
int len=strlen(s);
for (int j=;j<len;j++)
{
mask=(mask*+j)%len;
char t=s[j];
s[j]=s[mask];
s[mask]=t;
}
}
int main()
{
int q;
scanf("%d",&q);
sam.init();
scanf("%s",s);
sam.append(s);
while(q--)
{
scanf("%s",s);
if(s[]=='A')
{
gets(mask);
sam.append(s);
}
else
{
gets(mask);
int ans=sam.query(s);
mask^=ans;
printf("%d\n",ans);
}
}
return ;
}
bzoj2555(lct维护sam)的更多相关文章
- 【LOJ6041】「雅礼集训 2017 Day7」事情的相似度(用LCT维护SAM的parent树)
点此看题面 大致题意: 给你一个\(01\)串,每次询问前缀编号在一段区间内的两个前缀的最长公共后缀的长度. 离线存储询问 考虑将询问离线,按右端点大小用邻接表存下来(直接排序当然也可以啦). 这样的 ...
- BZOJ2555 SubString【SAM + Link Cut Tree】
BZOJ2555. SubString 要求在线询问一个串在原串中出现的次数,并且可以在原串末尾添加字符串 如果没有修改的话,考虑建出\(parent\)树之后统计每个\(endpos\)节点的\(r ...
- 【LCT维护基环内向树森林】BZOJ4764 弹飞大爷
4764: 弹飞大爷 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 101 Solved: 52[Submit][Status][Discuss] ...
- LCT维护子树信息(BZOJ4530:[BJOI2014]大融合)
题面 没有权限号的可以去LOJ Sol 大家都知道,\(LCT\)上有许多实边和虚边 实边就是每棵\(Splay\)上的既认父亲又认儿子的边 虚边就是\(Splay\)和\(Splay\)之间只认父亲 ...
- 【bzoj4530】[Bjoi2014]大融合 LCT维护子树信息
题目描述 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是它所在的当前能够联通的树上路过它的简单路径的数量 ...
- BZOJ4530[Bjoi2014]大融合——LCT维护子树信息
题目描述 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是它所在的当前能够 联通的树上路过它的简单路径的数 ...
- LOJ 121 「离线可过」动态图连通性——LCT维护删除时间最大生成树 / 线段树分治
题目:https://loj.ac/problem/121 离线,LCT维护删除时间最大生成树即可.注意没有被删的边的删除时间是 m+1 . 回收删掉的边的节点的话,空间就可以只开 n*2 了. #i ...
- LCT维护子树信息
有些题目,在要求支持link-cut之外,还会在线询问某个子树的信息.LCT可以通过维护虚边信息完成这个操作. 对于LCT上每个节点,维护两个两sz和si,后者维护该点所有虚儿子的信息,前者维护该点的 ...
- 【uoj#207】共价大爷游长沙 随机化+LCT维护子树信息
题目描述 给出一棵树和一个点对集合S,多次改变这棵树的形态.在集合中加入或删除点对,或询问集合内的每组点对之间的路径是否都经过某条给定边. 输入 输入的第一行包含一个整数 id,表示测试数据编号,如第 ...
随机推荐
- Eclipse调试:Run on server 和 Debug on server 区别
Run on server: 以正常模式运行程序.会直接把程序从头到尾执行一遍,运行完就结束,不会进入到源代码里面(即使源代码中设置了断点). Debug on server: 以调试模式运行程序,或 ...
- Ukulele 常用和弦
- STATIC 和 CLASS
STATIC 和 CLASS 由 王巍 (@ONEVCAT) 发布于 2015/01/28 Swift 中表示 “类型范围作用域” 这一概念有两个不同的关键字,它们分别是 static 和 class ...
- bzoj5469 [FJOI2018]领导集团问题
题目描述: bz luogu 题解: 相当于树上$LIS$问题. 考虑一维情况下的贪心,我们可以用multiset启发式合并搞. 代码: #include<set> #include< ...
- 使用Redis作为高速缓存
Redis适合哪些业务场景常规业务系统的数据库访问中,读写操作的比例一般在7/3到9/1,也就是说读操作远多于写操作,因此高并发系统设计里,通过NoSQL技术将热点数据(短期内变动概率小的数据)放入内 ...
- [CODEVS] 2193 数字三角形WW
数字三角形必须经过某一个点,使之走的路程和最大 从必须经过的点,向上向下分别DP两次的和即为答案. 还有一种思路是把和必须经过点同一行的设为-INF,这样就一定(大概)不会选择它们了. //Write ...
- 【php】 php-fpm 配置见解
来源:php官方文档 Init script setup=== You will probably want to create an init script for your new php-fpm ...
- redis配置cluster分布式集群
#下载最新的redis5. wget http://download.redis.io/releases/redis-5.0.3.tar.gz .tar.gz cd redis- make make ...
- 异常System.Threading.Thread.AbortInternal
异常信息: System.Threading.ThreadAbortException: 正在中止线程. 在 System.Threading.Thread.AbortInternal() 在 Sys ...
- 【Luogu】P2894酒店Hotel(线段树)
题目链接 我好蒻啊 题题看题解 线段树维护从左端点开始的最长连续空房.右端点结束的最长连续空房.整段区间的最长连续空房.区间非空房的个数. http://blog.csdn.net/qq_3955 ...