BZOJ 2555 SubString(LCT+后缀树)
喜闻乐见的LCT+SAM
此题要求动态插入,直接上后缀树。然后询问其实就是求一个节点的子树后缀结束节点的个数。
因为建立后缀树需要插入和删除,就直接上LCT。每次加入一个点,把它到根的路径加一
(现在我才知道access之后那个splay就是这个点到根的路径,LCT学得不好)
思路不需要说太多,就是码量大。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=3001000;
int T,ans;
char s[N];
int read(){
int sum=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return sum*f;
}
int get(int ans){
cin>>s;
int len=strlen(s);
for (int j=0;j<len;j++) {
ans=(ans*131+j)%len;
char c=s[j];
s[j]=s[ans];
s[ans]=c;
}
return len;
}
struct lct{
int fa[N],ch[N][2],w[N],lazy[N],stack[N];
void add(int x,int y){
w[x]+=y;lazy[x]+=y;
}
void pushdown(int x){
if(lazy[x]){
add(ch[x][0],lazy[x]);add(ch[x][1],lazy[x]);
lazy[x]=0;
}
}
bool isroot(int x){
return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;
}
bool son(int x){
return ch[fa[x]][1]==x;
}
void rotate(int x){
int y=fa[x],z=fa[y],a=son(x),b=son(y),c=ch[x][!a];
if(!isroot(y))ch[z][b]=x;fa[x]=z;
if(c)fa[c]=y;ch[y][a]=c;
ch[x][!a]=y;fa[y]=x;
}
void splay(int x){
int top=1,a=x;stack[top]=a;
while(a)stack[++top]=a=fa[a];
while(top)pushdown(stack[top--]);
while(!isroot(x)){
int y=fa[x],z=fa[y];
if(isroot(y))rotate(x);
else{
if(son(x)==son(y))rotate(y);
else rotate(x);
rotate(x);
}
}
}
void access(int x){
for(int j=0;x;j=x,x=fa[x])
splay(x),ch[x][1]=j;
}
void link(int x,int f){
fa[x]=f;access(f);splay(f);add(f,w[x]);
}
void cut(int x){
access(x);splay(x);add(ch[x][0],-w[x]);
fa[ch[x][0]]=0;ch[x][0]=0;
}
}t;
struct SAM{
int tot,u,ln[N],size[N],trans[N][27],fa[N];
void ins(int c){
int x=++tot;ln[x]=ln[u]+1;size[x]=1;
t.w[x]=1;
for(;u&&trans[u][c]==0;u=fa[u])trans[u][c]=x;
if(u==0)fa[x]=1,t.link(x,1);
else{
int v=trans[u][c];
if(ln[v]==ln[u]+1)fa[x]=v,t.link(x,v);
else{
int w=++tot;
ln[w]=ln[u]+1;fa[w]=fa[v];
t.link(w,fa[w]);
memcpy(trans[w],trans[v],sizeof(trans[w]));
fa[x]=fa[v]=w;
t.cut(v);t.link(v,w);t.link(x,w);
for(;u&&trans[u][c]==v;u=fa[u])trans[u][c]=w;
}
}
u=x;
}
void add(){
int len=get(ans);
for(int i=0;i<len;i++)ins(s[i]-'A'+1);
}
int check(){
int len=get(ans);
int now=1;
for(int i=0;i<len;i++){
if(trans[now][s[i]-'A'+1]==0)return 0;
now=trans[now][s[i]-'A'+1];
}
t.splay(now);
return t.w[now];
}
}sam;
int main(){
T=read();
sam.tot=sam.u=1;
cin>>s;
int len=strlen(s);
for(int i=0;i<len;i++)sam.ins(s[i]-'A'+1);
while(T--){
cin>>s;
if(s[0]=='Q'){
int tmp=sam.check();
printf("%d\n",tmp);
ans^=tmp;
}
else sam.add();
}
return 0;
}
BZOJ 2555 SubString(LCT+后缀树)的更多相关文章
- bzoj 2555: SubString【后缀自动机+LCT】
一直WA--找了半天错的发现居然是解密那里的mask其实是不能动的--传进去的会变,但是真实的那个不会变-- 然后就是后缀自动机,用LCT维护parent树了--注意不能makeroot,因为自动机的 ...
- bzoj 2555: SubString 后缀自动机+LCT
2555: SubString Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 688 Solved: 235[Submit][Status][Dis ...
- 字符串(LCT,后缀自动机):BZOJ 2555 SubString
2555: SubString Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1620 Solved: 471 Description 懒得写背景了 ...
- ●BZOJ 2555 SubString
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2555题解: 后缀自动机+LCT 不难发现,对于输入的询问串,在自动机里trans后的到的状态 ...
- 2555: SubString[LCT+SAM]
2555: SubString Time Limit: 30 Sec Memory Limit: 512 MB Submit: 2601 Solved: 780 [Submit][Status][ ...
- [BZOJ2555]SubString LCT+后缀自动机
2555: SubString Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 3253 Solved: 975[Submit][Status][Di ...
- bzoj 2555 SubString —— 后缀自动机+LCT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2555 建立后缀自动机,就可以直接加入新串了: 出现次数就是 Right 集合的大小,需要查询 ...
- bzoj 2555 SubString——后缀自动机+LCT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2555 要维护 right 集合的大小.因为 fa 会变,且 fa 构成一棵树,所以考虑用 L ...
- bzoj 2555 SubString(SAM+LCT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2555 [题意] 给定一个字符串,可以随时插入字符串,提供查询s在其中作为连续子串的出现 ...
随机推荐
- Qwiklab'实验-CloudFront, EFS, S3'
title: AWS之Qwiklab subtitle: 3. Qwiklab'实验-CloudFront, EFS, S3' date: 2018-09-21 17:29:20 --- Introd ...
- hdu2614 Beat
题意: 有n个问题. 给出你解决完第i个问题之后解决j问题所花的时间,花的时间越多表示难度越大,每次只能解决难度大于或等于上个题难度的问题.问你最多能解决多少问题. 他妈的,第一次做想半天想不出来如何 ...
- CF 949C Data Center Maintenance_强联通分量_思维题
题意: 某土豪公司建立了n个数据中心,把m份资料每份在其中的两个数据中心备份. 每个数据中心在一天h个小时当中有一个小时需要维护,此时不提供资料下载服务. 现在土豪公司想要将其中若干个数据中心的维护时 ...
- JS 日历
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx. ...
- js 获取对象长度
获取对象的程度,可以这样获取: var myObj = {a:1,b:2,c:3} var arr = Object.keys(myObj);var len = arr.length console ...
- Rsync和Sersync(企业实时同步方案)
注:本文章依据参考文章中的信息资料结合自己的实践操作而成 一.实验环境介绍 系统版本:Cent OS 7.4 X64 内核版本:3.10.0-693.5.2.el7.x86_64 系统采用最小化安装, ...
- 单元测试Struts2Spring项目的Action和Service(包含源码)
最近,认真实践了单元测试Struts2.Spring等Java项目,今天特意写的是单元测试Struts2Spring项目的Action和Service. 由于已经写过不少Web开发框架单元测试的代码, ...
- Thunder9(迅雷9)去掉右侧浏览器广告的方法
1.打开文件夹C:\Program Files (x86)\Thunder Network\Thunder9\Program\TBC 2.找到 ThunderBrowser.exe 3.重命名为任意名 ...
- 实现双向数据绑定mvvm
实现双向数据绑定mvvm
- js实现新闻滚动实例
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...