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\)树上树链剖分\(+\)树状数组 这种类 ...
随机推荐
- HDU 2082 找单词 (普通母函数)
题目链接 Problem Description 假设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,..... 字母Z的价值为26.那么,对于 ...
- 天梯赛 L2-012 关于堆的判断 (二叉树)
将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: "x is the root":x是根结点: "x and y ar ...
- es6新语法Object.assign()
1.介绍 Object.assign用于对象的合并,将源对象的所有可枚举属性复制到目标对象,只拷贝源对象自身的属性继承属性补考呗 Object.assign(target,source1,...)第一 ...
- oracle链接指定实例
sqlplus /@ORACLE_SID as sysdba; 其中ORACLE_SID为具体的实例名称, 比如连接到orcl实例就执行命令: sqlplus /@orcl as sysdba; se ...
- Skip List(跳跃表)原理详解与实现【转】
转自:http://dsqiu.iteye.com/blog/1705530 Skip List(跳跃表)原理详解与实现 本文内容框架: §1 Skip List 介绍 §2 Skip List 定义 ...
- php cache类代码(php数据缓存类)
如果访问量大的话会给数据库造成很大的负担,所以对于变化不经常的内容要做好php 数据cache(缓存)是十分必要的,我做了一个简单的php“文件缓存”的类,希望对大家有所帮助. 思路是这样的: 对于一 ...
- Caffe学习系列(8):solver,train_val.prototxt,deploy.prototxt及其配置
solver是caffe的核心. net: "examples/mnist/lenet_train_test.prototxt" test_iter: 100 test_inter ...
- 八大排序算法JS及PHP代码实现
从学习数据结构开始就接触各种算法基础,但是自从应付完考试之后就再也没有练习过,当在开发的时候也是什么时候使用什么时候去查一下,现在在学习JavaScript,趁这个时间再把各种基础算法整理一遍,分别以 ...
- python开发学习-day07(面向对象之多态、类的方法、反射、新式类and旧式类、socket编程)
s12-20160227-day07 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...
- Windows Azure 初体验
最近看到windows azure 在做活动,只需花一块钱就可以体验一个月的windows azure. 于是,我就注册了一个账号也尝试一把云时代,传送门. 注册很简单的,成功后可以看到这个界面. 然 ...