传送门

题意简述:

要求在线支持两个操作

(1):在当前字符串的后面插入一个字符串

(2):询问字符串s在当前字符串中出现了几次?(作为连续子串)


思路:

考虑用lctlctlct来动态维护samsamsam的rightrightright集合。

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int N=1200005;
char s[N];
int n;
string str;
inline void gets(int Mask){
	scanf("%s",s);
	str=s;
	for(ri i=0,up=str.size();i<up;++i){
		Mask=(Mask*131+i)%up;
		char t=str[i];
		str[i]=str[Mask];
		str[Mask]=t;
	}
}
int Mask=0;
namespace lct{
	int son[N][2],rev[N],siz[N],fa[N],add[N],stk[N],top=0;
	inline void pushnow(int p,int v){siz[p]+=v,add[p]+=v;}
	inline void pushdown(int p){if(add[p])pushnow(son[p][0],add[p]),pushnow(son[p][1],add[p]),add[p]=0;}
	inline bool isroot(int p){return !fa[p]||((p^son[fa[p]][0])&&(p^son[fa[p]][1]));}
	inline bool which(int p){return p^son[fa[p]][0];}
	inline void rotate(int x){
		int y=fa[x],z=fa[y],t=which(x);
		if(z&&!isroot(y))son[z][which(y)]=x;
		fa[y]=x,fa[x]=z,son[y][t]=son[x][t^1],son[x][t^1]=y;
		if(son[y][t])fa[son[y][t]]=y;
	}
	inline void splay(int x){
		stk[top=1]=x;
		for(ri p=x;!isroot(p);p=fa[p])stk[++top]=fa[p];
		while(top)pushdown(stk[top--]);
		while(!isroot(x)){if(!isroot(fa[x]))rotate(which(x)^which(fa[x])?x:fa[x]);rotate(x);}
	}
	inline void access(int x){for(ri y=0;x;x=fa[y=x])splay(x),son[x][1]=y;}
	inline void link(int x,int y){fa[x]=y,access(y),splay(y),pushnow(y,siz[x]);}
	inline void cut(int x){access(x),splay(x),pushnow(son[x][0],-siz[x]),fa[son[x][0]]=0,son[x][0]=0;}
}
namespace sam{
	int son[N][26],len[N],Link[N],tot=1,last=1;
	inline void insert(int x){
		int p=last,np=++tot;
		lct::siz[np]=1,len[last=np]=len[p]+1;
		while(p&&!son[p][x])son[p][x]=np,p=Link[p];
		if(!p)return lct::link(np,Link[np]=1);
		int q=son[p][x],nq;
		if(len[q]==len[p]+1)return lct::link(np,Link[np]=q);
		len[nq=++tot]=len[p]+1,memcpy(son[nq],son[q],sizeof(son[nq]));
		lct::link(nq,Link[nq]=Link[q]);
		lct::cut(q);
		lct::link(np,Link[np]=nq);
		lct::link(q,Link[q]=nq);
		while(p&&son[p][x]==q)son[p][x]=nq,p=Link[p];
	}
	inline void init(){scanf("%s",s+1);for(ri i=1,up=strlen(s+1);i<=up;++i)insert(s[i]-'A');}
	inline void add(){gets(Mask);for(ri i=0,up=str.size();i<up;++i)insert(str[i]-'A');}
	inline int query(){
		gets(Mask);
		int p=1;
		for(ri i=0,up=str.size();i<up;++i)if(!(p=son[p][str[i]-'A']))return 0;
		return lct::splay(p),lct::siz[p];
	}
}
int main(){
	scanf("%d",&n),sam::init();
	while(n--){
		char op[6];
		scanf("%s",op);
		if(op[0]=='A')sam::add();
		else{
			int ret=sam::query();
			Mask^=ret,cout<<ret<<'\n';
		}
	}
}

2019.03.01 bzoj2555: SubString(sam+lct)的更多相关文章

  1. 【BZOJ 2555】 2555: SubString (SAM+LCT)

    2555: SubString Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 2548  Solved: 762 Description 懒得写背景了 ...

  2. bzoj 2555 SubString(SAM+LCT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2555 [题意] 给定一个字符串,可以随时插入字符串,提供查询s在其中作为连续子串的出现 ...

  3. 【SPOJ】Longest Common Substring(后缀自动机)

    [SPOJ]Longest Common Substring(后缀自动机) 题面 Vjudge 题意:求两个串的最长公共子串 题解 \(SA\)的做法很简单 不再赘述 对于一个串构建\(SAM\) 另 ...

  4. 2019浙师大校赛(浙大命题)(upc复现赛)总结

    2019浙师大校赛(浙大命题)(upc复现赛)总结 早上九点开始.起得迟了,吃了早饭慌慌张张跑过去,刚到比赛就开始了. 开始分别从前往后和从后往前看题,一开始A题,第一发WA,第二次读题发现漏看了还有 ...

  5. BZOJ2555: SubString(后缀自动机,LCT维护Parent树)

    Description 懒得写背景了,给你一个字符串init,要求你支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 你必须在线支 ...

  6. BZOJ2555 SubString【SAM + Link Cut Tree】

    BZOJ2555. SubString 要求在线询问一个串在原串中出现的次数,并且可以在原串末尾添加字符串 如果没有修改的话,考虑建出\(parent\)树之后统计每个\(endpos\)节点的\(r ...

  7. BZOJ 2594: [Wc2006]水管局长数据加强版(kruskal + LCT)

    Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...

  8. 2019的hdu暑假作业(欢迎纠错)

    1219 遍历计数. #include<bits/stdc++.h> #define QAQ 0 using namespace std; ]; ]; int main(){ )){ me ...

  9. it's over | 2019 CSP-S 第二轮认证(超长预警)

    也许应该从Day -1(2019年11月14日周四)开始说起? 卑微的我们在学长的怂恿下终于...停课了(哇我们太菜了,只停一天半的课有个卵用 早读后我带头去办公室请假,飞哥很大方地答应了,同时免了我 ...

随机推荐

  1. [SQL]sql server中如何直接查询存储过程EXEC返回的结果集?

    Declare @T Table (iDay VARCHAR(),iNum DECIMAL(,),yuxiang DECIMAL(,)) Insert @T --EXEC [dbo].[BSP0101 ...

  2. Android 最简单的MVP案例;

    随手撸个发出来: V:界面层 //界面层需要实现P.View方法,然后重写P.View中的方法:M层给的数据就在这些个方法的参数中: // 还要获取到P.Provide的实例,使用P.Provide去 ...

  3. 红黑树Python实现

    # coding=utf-8 # 红黑树Python实现 # 颜色常量 RED = 0 BLACK = 1 def left_rotate(tree, node): if not node.right ...

  4. vue中.sync 修饰符

    一直以来,都不太明白.sync的用法,归根结底原因在于,没有仔细阅读“.sync修饰符”. 正好,最近在拿一个项目练手,然后使用了elment-ui,然后在用到dialog的时候,属性visible是 ...

  5. 四张图带你了解Tomcat系统架构

    一.Tomcat顶层架构 先上一张Tomcat的顶层结构图(图A),如下: Tomcat中最顶层的容器是Server,代表着整个服务器,从上图中可以看出,一个Server可以包含至少一个Service ...

  6. IntelliJ IDEA 导入多个maven项目

    IntelliJ IDEA的功能十分强大  我们日常开发项目会分多个maven项目 idea单个打开切换很是麻烦 下边是idea可以同时导入多个项目的方法 1.选择 FIle -> NEW -& ...

  7. Android Studio2.0 教程从入门到精通Windows版 - 入门篇

    http://www.open-open.com/lib/view/open1468121363300.html 本文转自:深度开源(open-open.com)原文标题:Android Studio ...

  8. jquery之过滤filter,not

    <body> <h1>欢迎来到我的主页</h1> <p>我是唐老鸭</p> <p class="intro"> ...

  9. Blob分析--粘连颗粒检测 基于距离变换的分水岭区域分割 盆地与原连通域求交集

    文章转自微信公众号:机器视觉那些事 *******************************************************************公众号:机器视觉那些事儿*** ...

  10. Python代码的人机大战(循环嵌套)

    第一次动手写随笔,记录一下今早的1.5小时努力成果 题目是这样的 : 人和机器进行猜拳游戏写成一个类,首先选择角色:1 曹操 2张飞 3 刘备,然后选择的角色进行猜拳:1剪刀 2石头 3布 玩家输入一 ...