bzoj 3881 [Coci2015]Divljak——LCT维护parent树链并
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3881
对 S 建 SAM ,每个 T 会让 S 的 parent 树的链并答案+1;在 T 走每一步的时候,走到的节点用 LCT access 一下,就能找到该点到 parent 根的链。
给链打标记。在 access 的过程中,如果遇到已经打过这个 T 标记的点,就停止 access 。
注意实现的时候,在判断 fa[x] 有没有标记之前要先 splay(fa[x]) 。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ls c[cr][0]
#define rs c[cr][1]
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
const int N=1e5+,M=2e6+,K=;
int n,ps[N],tot=,c[M][K],tc[M][K],fl[M],q[M];
int tim,dfn[M],fa[M],vl[M],tg[M],sta[M];
char s[M];
bool isrt(int x){return c[fa[x]][]!=x&&c[fa[x]][]!=x;}
void cz(int cr)
{
if(!tg[cr])return; int w=tg[cr];tg[cr]=;
vl[ls]+=w; vl[rs]+=w;
tg[ls]+=w; tg[rs]+=w;
dfn[ls]=dfn[rs]=dfn[cr];///
}
void rotate(int x)
{
int y=fa[x],z=fa[y],d=(x==c[y][]);
if(!isrt(y))c[z][y==c[z][]]=x;
fa[x]=z; fa[y]=x; fa[c[x][!d]]=y;
c[y][d]=c[x][!d]; c[x][!d]=y;
}
void splay(int x)
{
int top; sta[top=]=x;
for(int k=x;!isrt(k);k=fa[k])sta[++top]=fa[k];
for(int i=top;i;i--)cz(sta[i]);
for(int y=fa[x],z=fa[y];!isrt(x);rotate(x),y=fa[x],z=fa[y])
if(!isrt(y))
((y==c[z][])^(x==c[y][]))?rotate(x):rotate(y);
}
void access(int x)
{
splay(x); if(dfn[x]==tim)return;
int t=;
while()
{
c[x][]=t;
if(!fa[x])
{ tg[x]++;vl[x]++;dfn[x]=tim;return;}
splay(fa[x]);//splay first
if(dfn[fa[x]]==tim)
{ tg[x]++;vl[x]++;dfn[x]=tim;return;}
t=x; x=fa[x];
}
}
void link(int x,int y){ fa[y]=x;}
int Ins()
{
int cr=,len=strlen(s+);
for(int i=;i<=len;i++)
{
int w=s[i]-'a';
if(!tc[cr][w])tc[cr][w]=++tot;
cr=tc[cr][w];
}
return cr;
}
void get_fl()
{
int he=,tl=;
for(int i=,v;i<K;i++)
if((v=tc[][i]))
{q[++tl]=v;fl[v]=;link(,v);}
else tc[][i]=;
while(he<tl)
{
int k=q[++he],pr=fl[k];
for(int i=,v;i<K;i++)
if((v=tc[k][i]))
{ q[++tl]=v;fl[v]=tc[pr][i];link(tc[pr][i],v);}
else tc[k][i]=tc[pr][i];
}
}
void solve()
{
tim++; int cr=,len=strlen(s+);
for(int i=;i<=len;i++)
{
cr=tc[cr][s[i]-'a'];
access(cr);
}
}
int main()
{
n=rdn();
for(int i=;i<=n;i++)
{ scanf("%s",s+); ps[i]=Ins();}
get_fl();
int Q=rdn(),op,x;
while(Q--)
{
op=rdn();
if(op==)
{ scanf("%s",s+); solve();}
else
{
x=rdn(); x=ps[x];
splay(x); printf("%d\n",vl[x]);
}
}
return ;
}
bzoj 3881 [Coci2015]Divljak——LCT维护parent树链并的更多相关文章
- BZOJ 3881 [COCI2015]Divljak (Trie图+Fail树+树链的并+树状数组维护dfs序)
题目大意: Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. ...
- BZOJ 3881 [Coci2015]Divljak(AC自动机+树状数组)
建立AC自动机然后,加入一个串之后考虑这个串的贡献.我们把这个串扔到AC自动机里面跑.最后对经过每一个点到的这个点在fail树的根的路径上的点有1的贡献.求链的并,我们把这些点按DFS序排序,然后把每 ...
- BZOJ 3881: [Coci2015]Divljak [AC自动机 树链的并]
3881: [Coci2015]Divljak 题意:添加新文本串,询问某个模式串在多少种文本串里出现过 模式串建AC自动机,考虑添加一个文本串,走到的节点记录下来求树链的并 方法是按dfs序排序去重 ...
- BZOJ 3881: [Coci2015]Divljak
3881: [Coci2015]Divljak Time Limit: 20 Sec Memory Limit: 768 MBSubmit: 553 Solved: 176[Submit][Sta ...
- bzoj 3881 [Coci2015]Divljak fail树+树链的并
题目大意 Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: "1 P",Bob往自己的集合里添 ...
- BZOJ2555: SubString(后缀自动机,LCT维护Parent树)
Description 懒得写背景了,给你一个字符串init,要求你支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 你必须在线支 ...
- bzoj 3881: [Coci2015]Divljak AC自动机
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3881 题解: 这道题我想出了三种做法,不过只有最后一种能过. 第一种: 首先我们把所有的 ...
- BZOJ 3881[COCI2015]Divljak (AC自动机+dfs序+lca+BIT)
显然是用AC自动机 先构建好AC自动机,当B中插入新的串时就在trie上跑,对于当前点,首先这个点所代表的串一定出现过,然后这个点指向的fail也一定出现过.那么我们把每个点fail当作父亲,建一棵f ...
- BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )
BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...
随机推荐
- EDA课设-交通灯-Verilog版----FPGA--004
分得到析四个状态: S1: 主干道(绿灯亮) ,支干道(亮红灯):--40S S1: 主干道 (黄灯亮) ,支干道(亮红灯):--4S S1: 主干道 (亮红灯),支干道(绿灯亮):--20S S1: ...
- Vue响应式原理的实现-面试必问
Vue2的数据响应式原理 1.什么是defineProperty? defineProperty是设置对象属性,利用属性里的set和get实现了响应式双向绑定: 语法:Object.definePro ...
- 转载:IDEA配置SVN及使用
转自:https://blog.csdn.net/zwj1030711290/article/details/80687365 1.安装svn客户端 之前用myEcplise只需要插件,现在IDEA需 ...
- (转)JVM运行时数据区
转:http://www.cnblogs.com/myna/p/7567208.html java虚拟机运行时数据区,具体分为如下几个区域 程序计数器(Program Counter Register ...
- Gym-100676E Time Limit Exceeded?
原题链接 https://odzkskevi.qnssl.com/1110bec98ca57b5ce6aec79b210d2849?v=1491063604 ********************* ...
- NTP时钟调整策略
一. 问题背景 天威视讯项目3月底发生了一次点播出现节目请求超时的情况,在查询故障的过程中,发现MAP服务器操作系统的时钟被向前调整了11秒,姑且不论是否是这个原因导致的故障,但每台服务 ...
- jmeter 导入csv数据中json格式数据取值不完整
1.jmeter中添加csv数据文件时,数据是json格式 2.jmeter中执行取值发现只取了一部分 分析原因,json格式数据,中间有逗号,而csv是根据逗号来分割的,这回导致我们取值错位. 解决 ...
- yarn 国内加速,修改镜像源
为什么慢 由于默认情况下执行 yarn 各种命令是去国外的 yarn 官方镜像源获取需要安装的具体软件信息,所以在不使用代理.不翻墙的情况下,从国内访问国外服务器的速度相对比较慢 可以通过以下命令快速 ...
- xstart使用方法
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/YABIGNSHI/article/det ...
- kaggle-制作评分卡
https://blog.csdn.net/zpxcod007/article/details/80118580 制作A卡,申请评分卡 数据集:15万个样本,特征 主要预处理手段:缺失值,异常值,样本 ...