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,表示测试数据编号,如第 ...
随机推荐
- 响应式Web设计- Viewport
什么是Viewport? viewport是用户网页的可视区域, 翻译为中文可以叫做"视区". 设置Viewport 一个常用的针对移动网页优化过的页面的Viewport meta ...
- shell脚本,按行读取文件的几种方法。
第一种方法用while实现按读取文件.[root@localhost wyb]# cat a.txt 第一行 aaaaaa 第二行 bbbbbb 第三行 cccccc 第四行 dddddd 第五行 e ...
- Greenplum/Deepgreen(集群/分布式)安装文档
Deepgreen分布式安装文档 环境准备 1.安装VMware虚拟机软件,然后在VMware安装三台Linux虚拟机(使用centos7版本) 2.使用的虚拟机如下: 192.168.136.155 ...
- STL 之 vector的应用
关于vector vector是C++提供的一个容器,它是一个能够存放任意类型的动态数组,可以随时增加和压缩数据. 使用vector时需要注意以下几点: 1. 如果要表示的向量长度较长(需要为向量内部 ...
- 使用Fiddler抓取Android模拟器中的Android_APP请求
对Fiddler的设置:在https://www.telerik.com/download/fiddler网站上下载Fiddler,输入内容后点击下面按钮进行下载: 下载成功后,打开Fiddler进行 ...
- PHP 把字符转换为 HTML 实体 - htmlentities() 函数
定义和用法 htmlentities() 函数把字符转换为 HTML 实体. 语法 htmlentities(string,quotestyle,character-set) 参数 描述 string ...
- CSS3-弹性盒模型-FlexBox
Flex容器属性 display 定义一个Flex容器,根据其取的值来决定是内联还是块.Flex容器会为其内容建立新的伸缩格式化上下文. .container { display: flex; /* ...
- 非memory空间有地址分配
对于非memory空间有地址分配,是由于有寄存器配置,比如AHB.APB.一些外设.
- solr 日志配置
配置Solr日志记录 临时记录设置 您可以使用Admin Web界面来控制Solr中的日志输出量.选择LOGGING链接.请注意,此页面只允许您更改正在运行的系统中的设置,并不会保存在下一次运行中 ...
- nw335 debian sid x86-64 --3 linux内核自带
nw335 debian sid x86-64 --3 linux内核自带