BZOJ2434 NOI2011阿狸的打字机
询问x这个串在y中出现的次数。
fail数组有一个性质就是一旦a的fail指向b那么b所代表的字串一定是a的后缀。
所以我们看fail树(即按fail反向建树)中x的子树有多少y的结点即可。
这个操作可以使用树状数组维护dfs序操作。
By:大奕哥
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
int head[N],dead[N],cnt,ent,dnt,num,n,m,idx,fa[N],pos[N],l[N],r[N];
char s[N];
queue<int>q;
struct poin{
int v[],f,s;
}t[N<<];
struct node{
int to,nex;
}e[N];
struct edge{
int to,nex;
}d[N];
void add(int x,int y)
{
e[++ent].to=y;e[ent].nex=head[x];head[x]=ent;
}
void add2(int x,int y)
{
d[++dnt].to=y;d[dnt].nex=dead[x];dead[x]=dnt;
}
int tr[N<<];
inline int lowbit(int x){return x&(-x);}
int query(int x)
{
int ans=;
for(;x;x-=lowbit(x))ans+=tr[x];
return ans;
}
void update(int x,int w)
{
for(;x<=idx;x+=lowbit(x))tr[x]+=w;
}
void build()
{
int now=;
for(int i=;i<n;++i)
{
if(s[i]=='P')pos[++num]=now;
else if(s[i]=='B')now=fa[now];
else{
if(!t[now].v[s[i]-'a'])
t[now].v[s[i]-'a']=++cnt;
fa[t[now].v[s[i]-'a']]=now;
now=t[now].v[s[i]-'a'];
}
}
return;
}
void getfail()
{
for(int i=;i<;++i)
{
if(t[].v[i])
q.push(t[].v[i]),t[t[].v[i]].f=;
}
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=;i<;++i)
{
if(t[x].v[i])
{
t[t[x].v[i]].f=t[t[x].f].v[i];
q.push(t[x].v[i]);
}
else{
t[x].v[i]=t[t[x].f].v[i];
}
}
}
return;
}
void maketree()
{
for(int i=;i<=cnt;++i)
{
int x=t[i].f;int y=i;
add(x,y);
}
return;
}
void dfs(int x)
{
l[x]=++idx;
for(int i=head[x];i;i=e[i].nex)
{
int y=e[i].to;
dfs(y);
}
r[x]=++idx;
return;
}
int ans[N];
void work()
{
scanf("%d",&m);int id;int x,y;
for(int i=;i<=m;++i)
{
scanf("%d%d",&x,&y);add2(y,x);
}int now=;
for(int i=;i<n;++i)
{
if(s[i]=='B')
{
update(l[now],-);now=fa[now];
}
else if(s[i]=='P')
{
++id;
for(int j=dead[id];j;j=d[j].nex)
{
int y=pos[d[j].to];
ans[j]=query(r[y])-query(l[y]-);
}
}
else
{
now=t[now].v[s[i]-'a'];
update(l[now],);
}
}
for(int i=;i<=m;++i)
printf("%d\n",ans[i]);
return;
}
int main()
{
scanf("%s",s);
n=strlen(s);
build();
getfail();
maketree();
dfs();
work();
return ;
}
BZOJ2434 NOI2011阿狸的打字机的更多相关文章
- BZOJ2434 [Noi2011]阿狸的打字机 【AC自动机 + fail树 + 树状数组】
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 3610 Solved: 1960 [Submit][S ...
- BZOJ2434: [NOI2011]阿狸的打字机(AC自动机+dfs序+树状数组)
[NOI2011]阿狸的打字机 题目链接:https://www.luogu.org/problemnew/show/P2414 题目背景 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机. ...
- Bzoj2434 [Noi2011]阿狸的打字机
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2536 Solved: 1415 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到 ...
- BZOJ2434 [Noi2011]阿狸的打字机(AC自动机 + fail树 + DFS序 + 线段树)
题目这么说的: 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的: 输入小 ...
- BZOJ2434: [Noi2011]阿狸的打字机(AC自动机 树状数组)
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4140 Solved: 2276[Submit][Status][Discuss] Descript ...
- BZOJ2434[Noi2011]阿狸的打字机——AC自动机+dfs序+树状数组
题目描述 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的: l 输入小 ...
- BZOJ2434:[NOI2011]阿狸的打字机(AC自动机,线段树)
Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的 ...
- BZOJ2434: [Noi2011]阿狸的打字机(fail树+dfs序)
Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的 ...
- BZOJ2434 [NOI2011] 阿狸的打字机 【树链剖分】【线段树】【fail树】【AC自动机】
题目分析: 画一下fail树,就会发现就是x的子树中属于y路径的,把y剖分一下,用线段树处理 $O(n*log^2 n)$. 代码: #include<bits/stdc++.h> usi ...
- 沉迷AC自动机无法自拔之:[BZOJ2434] [Noi2011] 阿狸的打字机
如标题所言,我已经沉迷于AC自动机无法自拔了... 这又是一道AC自动的题,红红火火恍恍惚惚 这题目做起来真舒服 简单概括一下:\(AC\)自动机\(fail\)树上树链剖分\(+\)树状数组 这种类 ...
随机推荐
- 【CODEVS】1034 家园
[算法]网络流-最大流(dinic) [题解] 飞船有可承载人数限制,地球为源点,月球为汇点,人像水流一样从以飞船上限为容量的边流向汇点. 人在各站点都面临着上船与否的选择,难以用DP解决最优策略,于 ...
- Shodan 使用
本文来自:Shodan新手入坑指南, 记录简要用法,以便使用. 文章先给出搜索过滤方法,然后再简单介绍两种使用shodan的方法:使用命令和编写代码. 搜索过滤 hostname:搜索指定的主机或域名 ...
- 爬虫--PySpider框架
PySpider框架 PySpider框架的作用
- bzoj 3123 可持久化线段树启发式合并
首先没有连边的操作的时候,我们可以用可持久化线段树来维护这棵树的信息,建立权值可持久化线段树,那么每个点继承父节点的线段树,当询问为x,y的时候我们可以询问rot[x]+rot[y]-rot[lca( ...
- matlab求逆运算:左除( \ )和右除( / ),inv,pinv
矩阵求逆可以使用左除(\)和右除(/),inv,pinv 首先了解需要求逆的矩阵A是否为奇异方阵 inv 若A为非奇异方阵,则存在逆矩阵,可利用inv求逆: inv(A) pinv 若需要求逆的矩阵A ...
- Android仿新浪新闻SlidingMenu界面的实现 .
先看看原图: 如图所示,这种侧滑效果以另一种方式替代了原先tab导航的那种用户体验方式 给人耳目一新的感觉,现已被广大知名应用所效仿,如新浪新闻,网易新闻,人人网等 那么这种效果该如何实现呢?那就需要 ...
- 制作一棵ztree
我们在做web项目时,常会用到一些树形菜单.在此,我们利用ztree实现树形菜单的效果.zTree 是一个依靠 jQuery 实现的多功能 “树插件”.优异的性能.灵活的配置.多种功能的组合是 zTr ...
- CSS初步了解
CSS 概述 个人理解为对html的扩展,对html关键字进行功能添加. CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 样式通常存储在样式表 ...
- Codeforces 822C Hacker, pack your bags!(思维)
题目大意:给你n个旅券,上面有开始时间l,结束时间r,和花费cost,要求选择两张时间不相交的旅券时间长度相加为x,且要求花费最少. 解题思路:看了大佬的才会写!其实和之前Codeforces 776 ...
- hdu 1597(矩阵快速幂)
1597: 薛XX后代的IQ Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 228 Solved: 55[Submit][Status][Web Bo ...