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\)树上树链剖分\(+\)树状数组 这种类 ...
随机推荐
- 从python入门ruby
1.Ruby的函数可以不使用括号 def h(name) puts "hello #{name}" end h "jack" 2.python可以直接访问实例的 ...
- 第三讲:ifconfig:最熟悉又陌生的命令行
你知道怎么查看IP地址吗? 当面试听到这个问题的时候,面试者常常会觉得走错了房间.我面试的是技术岗位啊,怎么问这么简单的问题? 的确,即便没有专业学过计算机的人,只要倒腾过电脑,重装过系统,大多也会知 ...
- Ubuntu 14.04 64位上安装wps office软件(转http://m.blog.csdn.net/blog/yhc13429826359/24179933)
废话少说,只给出方法供各位参考!wps for Linux版本已经有两三年没有大的动作,当然其他平台,比如windows,Android,ios上的wps效果还是很赞的说. 下面是我成功安装的步骤: ...
- shell读取文件的每一行内容并输出【转】
写法一: #!/bin/bash while read line do echo $line done < file(待读取的文件) 写法二: #!/bin/bash cat file(待读取的 ...
- cocos2d-x android 添加新场景报错: undefined reference to `vtable for XXX'
转载自 居家懒人 http://www.cnblogs.com/JD85/archive/2012/09/17/2688128.html 加入写了新场景SecondScene,结果在cpp文件里类名地 ...
- python3.x的HTMLTestRunner.py文件
"""A TestRunner for use with the Python unit testing framework. Itgenerates a HTML re ...
- 大型网站的 HTTPS 实践(一)—— HTTPS 协议和原理(转)
原文链接:http://op.baidu.com/2015/04/https-s01a01/ 1 前言 百度已经于近日上线了全站 HTTPS 的安全搜索,默认会将 HTTP 请求跳转成 HTTPS.本 ...
- VS里属性窗口中的生成操作释义
生成操作:无,编译 ,内容 ,嵌入的资源... 如果是类.cs文件,就得编译之后你才能使用的.如果是txt,excel 这种文件,就属性内容或者资源文件了. 内容(Content) - 不编译该文件, ...
- Java显式锁学习总结之三:AbstractQueuedSynchronizer的实现原理
概述 上一篇我们讲了AQS的使用,这一篇讲AQS的内部实现原理. 我们前面介绍了,AQS使用一个int变量state表示同步状态,使用一个隐式的FIFO同步队列(隐式队列就是并没有声明这样一个队列,只 ...
- Copy List with Random Pointer——技巧
A linked list is given such that each node contains an additional random pointer which could point t ...