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,表示测试数据编号,如第 ...
随机推荐
- CS193p Lecture 6 - UINavigation, UITabBar
抽象类(Abstract):指的是这个类不能被实例化,只能被继承: OC中没有关键词来标明某个类是抽象类,只能在注释中标注一下: 抽象类中的抽象方法,必须是public的,使方法称为public的方法 ...
- 科普NDIS封包过滤
闲言: 这个月一直在学习NDIS驱动编程,杂七杂八的资料都看个遍了,做了点笔记,捋捋思路,发上来备忘. Ps:只是小菜的一点学习笔记,没什么技术含量,不过版主如果觉得对大家稍微有点帮助的话 ...
- Django模型中字段属性choice的使用
根据Django官方文档: from django.db import models class Student(models.Model): FRESHMAN = 'FR' SOPHOMORE = ...
- centos6 安装windows字体
注意:字体文件必须是TTF或者ttf格式的文件, 1.yum install -y fontconfig mkfontscale2.mkdir -p /usr/share/fonts/windows_ ...
- python 中requests 模块用py2exe生成exe后SSL certificate exception的问题
[('system library', 'fopen', 'No such process'), ('BIO routines', 'BIO_new_file', 'no such file'), ( ...
- 计算机/ARM 系统
这方面知识,自己有了大概了解,可以再没有重要急需学习的安排时,不时的翻翻这方面的书.本能力属于重要但不急需的能力
- 【转发】【linux】【php】centos 编译php常见错误
configure: error: xml2-config not found. Please check your libxml2 installation. yum install libxml2 ...
- 对linux中source,fork,exec的理解以及case的 使用
fork 使用 fork 方式运行 script 时, 就是让 shell(parent process) 产生一个 child process 去执行该 script, 当 child proc ...
- Java-替换字符串中的字符
package com.tj; public class MyClass implements Cloneable { public static void main(String[] args) { ...
- C++中的临时变量
临时变量有两个特征: 1.invisiable,在程序代码中没有显式出现 2 没有名字 non - named. 出现临时变量/对象的场合1.函数的返回值2. 参数传递 值传递 by - value ...