#include<cstdio>
#include<iostream>
#include<cstring>
#define M 100008
using namespace std;
char ch[M];
int cnt=,pos[M],now,fa[M],fail[M],q[M],head[M],next[M],u[M],cnt1,m,n;
int a[M][],head1[M],next1[M],u1[M],T,l[M],r[M],an[M],su[*M];
void build()
{
int h=,t=;
q[]=;
for(;h<t;)
{
int p=q[++h];
for(int i=;i<=;i++)
if(a[p][i])
{
int now=fail[p];
q[++t]=a[p][i];
for(;!a[now][i];now=fail[now]);
fail[a[p][i]]=a[now][i];
}
}
return;
}
void jia(int a1,int a2)
{
cnt1++;
u[cnt1]=a2;
next[cnt1]=head[a1];
head[a1]=cnt1;
return;
}
void dfs(int a1)
{
l[a1]=++T;
for(int i=head[a1];i;i=next[i])
dfs(u[i]);
r[a1]=++T;
}
int xun(int a1)
{
int sum=;
for(int i=a1;i;i-=i&-i)
sum+=su[i];
return sum;
}
void add(int a1,int a2)
{
for(int i=a1;i<=T;i+=i&-i)
su[i]+=a2;
}
int main()
{
scanf("%s",ch+);
now=;
n=strlen(ch+);
for(int i=;i<=n;i++)
if(ch[i]=='P')
{
pos[]++;
pos[pos[]]=now;
}
else if(ch[i]=='B')
now=fa[now];
else
{
if(!a[now][ch[i]-])
{
cnt++;
a[now][ch[i]-]=cnt;
fa[cnt]=now;
}
now=a[now][ch[i]-];
}
for(int i=;i<=;i++)
a[][i]=;
build();
for(int i=;i<=cnt;i++)
jia(fail[i],i);
scanf("%d",&m);
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
u1[i]=x;
next1[i]=head1[y];
head1[y]=i;
}
dfs();
now=;
pos[]=;
for(int i=;i<=n;i++)
if(ch[i]=='P')
{
pos[]++;
for(int i=head1[pos[]];i;i=next1[i])
an[i]=xun(r[pos[u1[i]]])-xun(l[pos[u1[i]]]-);
}
else if(ch[i]=='B')
{
add(l[now],-);
now=fa[now];
}
else
{
now=a[now][ch[i]-];
add(l[now],);
}
for(int i=;i<=m;i++)
printf("%d\n",an[i]);
return ;
}

AC自动机 根据dfs序建立fail树(就是将失败指针反向),每次查询x子树中有多少y的节点。

bzoj 2434: [Noi2011]阿狸的打字机的更多相关文章

  1. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

  2. BZOJ 2434: [Noi2011]阿狸的打字机( AC自动机 + DFS序 + 树状数组 )

    一个串a在b中出现, 那么a是b的某些前缀的后缀, 所以搞出AC自动机, 按fail反向建树, 然后查询(x, y)就是y的子树中有多少是x的前缀. 离线, 对AC自动机DFS一遍, 用dfs序+树状 ...

  3. bzoj 2434 [Noi2011]阿狸的打字机 AC自动机

    [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4001  Solved: 2198[Submit][Status][D ...

  4. 【刷题】BZOJ 2434 [Noi2011]阿狸的打字机

    Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的 ...

  5. BZOJ 2434: [Noi2011]阿狸的打字机 AC自动机+fail树+线段树

    Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的 ...

  6. bzoj 2434 [Noi2011]阿狸的打字机(fail树+离线处理+BIT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2434 [题意] 按照一定规则生成n个字符串,回答若干个询问:(x,y),问第x个字符串 ...

  7. BZOJ 2434 [Noi2011]阿狸的打字机(AC自动机)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2434 [题目大意] 给出一个打印的过程,'a'-'z'表示输入字母,P表示打印该字符串 ...

  8. bzoj 2434 [Noi2011]阿狸的打字机——AC自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2434 dfs AC自动机,走过的点权值+1,回溯的时候权值-1:走到询问的 y 串的节点,看 ...

  9. ●BZOJ 2434: [Noi2011]阿狸的打字机

    ●赘述题目 (题意就不赘述了) ●解法: ●我先想的一个比较暴力的方法(要TLE): (ac自动机)先求出last数组(参见刘汝佳的解释:last[j]:表示j节点沿着失配指针往回走时,遇到的下一个单 ...

随机推荐

  1. (转)接口自动化测试 – Java+TestNG 测试 Restful Web Service

    本文主要介绍如何用Java针对Restful web service 做接口自动化测试(数据驱动),相比UI自动化,接口自动化稳定性可靠性高,实施难易程度低,做自动化性价比高.所用到的工具或类库有 T ...

  2. rsync同步完整配置

    一.需求: 1.对于分公司访问一些服务器(如工程图纸服务器),如果通过Internet上的VPN访问总是觉得速度慢,毕竟带宽有限,为了解决此问题,可以两地建立同步镜像服务器,分公司可以访问本地的镜像服 ...

  3. mongodb数据库js查询

    #健康风险-disease db.disease.find({versions:'2'}).forEach(function(item){ item.diseaseDetail && ...

  4. matlab灰度变彩色+白平衡算法实现

    % matlab彩色图像分离通道并合并成处理后的彩色图像(彩色变灰度再变彩色) % 白平衡算法(灰度世界法)消除RGB受光照影响 clear all; close all; %读入原始图像 srcIm ...

  5. DedeCMSV57数据库结构文档

        表名:dede_addonarticle(ENGINE=MyISAM/CHARSET=gbk) 说明:Top 字段名 说明描述 具体参数 aid 文章ID mediumint(8) unsig ...

  6. OneProxy与其它数据库中间件的对比

    OneProxy 优点 性能 缺点 闭源,被商业公司掌控,到时候随别人蹂躏 可维护性极差,缺乏友好的出错信息,光维护这个环节就被他人掌控 定价不明 有没有这样的公司? 大到10wtps,但是没人能理解 ...

  7. JavaScript及C# URI编码详解

    转载自:http://www.cnblogs.com/artwl/archive/2012/03/07/2382848.html 应用Uri编码,可以把一个或多个Uri作为另一个Uri的参数(如果不用 ...

  8. angular 零碎知识

    各种服务: $location:可以监听事件的改变 link 在没有设置template的情况下,指令作为标签使用的时候,ele是指令(伪数组的形式); * 如果指令作为属性使用的话,ele是使用该指 ...

  9. before和after的强大

    前言:刚学他两个的时候,是用于清除浮动,而且曾单纯的以为俩只有这作用. 但看到几篇博客后,发现自己是多么的无知,他两个的强大远不止于此. 当然,这篇文章大多数是借鉴网上的实例,在加上自己的些许简介而成 ...

  10. js时间显示设置

    //对日期中部分小于10的数字前边添加0 function zero(s){ return s < 10 ? '0' + s: s; } var date=new Date(), year = ...