http://www.lydsy.com/JudgeOnline/problem.php?id=2434

思路:建立fail树,并找出dfs序,那剩下要做的就是每次找到一个串的位置,然后询问它的区间里面有多少我当前串的节点,具体做法见代码。

#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
struct edge{
int to,next,id;
}que[];
int fail[],sz,ch[][],root,num,hw,low[],dfn[];
char s[];
int pos[],id,fi[],first[],next[],tot,go[];
int fa[],ans[],V[],n,m;
void insert(int x,int y){
tot++;
go[tot]=y;
next[tot]=first[x];
first[x]=tot;
}
void add(int x,int v){
for (int i=x;i<=hw;i+=(i)&(-i)){
V[i]+=v;
}
}
int query(int x){
int res=;
for (int i=x;i;i-=(i)&(-i)){
res+=V[i];
}
return res;
}
void build(){
int now=;sz=;
for (int i=;i<n;i++){
if (s[i]=='P') pos[++id]=now;
else
if (s[i]=='B') now=fa[now];
else{
int k=s[i]-'a';
if (ch[now][k]==) ch[now][k]=++sz,fa[sz]=now;
now=ch[now][k];
}
}
}
void bfs(){
std::queue<int>Q;
for (int i=;i<;i++)
if (!ch[root][i]) ch[root][i]=root;
else if (ch[root][i]){
fail[ch[root][i]]=root;
Q.push(ch[root][i]);
}
while (!Q.empty()){
int now=Q.front();Q.pop();
for (int i=;i<;i++)
if (!ch[now][i]){
ch[now][i]=ch[fail[now]][i];
}else{
fail[ch[now][i]]=ch[fail[now]][i];
Q.push(ch[now][i]);
}
}
}
void dfs(int x){
dfn[x]=++hw;
for (int i=first[x];i;i=next[i]){
int pur=go[i];
dfs(pur);
}
low[x]=++hw;
}
void solve(){
add(dfn[],);//root节点也算上
int sx=,now=;
for (int i=;i<n;i++){
if (s[i]=='P'){
sx++;
for (int j=fi[sx];j;j=que[j].next){
int pur=pos[que[j].to];
ans[que[j].id]+=query(low[pur])-query(dfn[pur]-);
}//询问dfs序区间里面有多少标记过的节点,有多少就代表y到root路径上的节点有多少能走到x的尾节点
}else
if (s[i]=='B') add(dfn[now],-),now=fa[now];//删除的时候去掉
else{
now=ch[now][s[i]-'a'];
add(dfn[now],);//走一步加一步
}
}
}
int main(){
scanf("%s",s);root=;
n=strlen(s);
build();
bfs();//建AC自动机
for (int i=;i<=sz;i++)
insert(fail[i],i);//建fail树
dfs();//找dfs序
scanf("%d",&m);
for (int i=;i<=m;i++){//把y相同的询问弄到一起
int x,y;
scanf("%d%d",&x,&y);
num++;
que[num].to=x;
que[num].next=fi[y];
que[num].id=i;
fi[y]=num;
}
solve();//统计答案
for (int i=;i<=m;i++)
printf("%d\n",ans[i]);
}

BZOJ 2434 阿狸的打字机的更多相关文章

  1. AC自动机:BZOJ 2434 阿狸的打字机

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

  2. bzoj 2434 阿狸的打字机 - Aho-Corasick自动机 - 树状数组

    题目传送门 传送站I 传送站II 题目大意 阿狸有一个打字机,它有3种键: 向缓冲区追加小写字母 P:打印当前缓冲区(缓冲区不变) B:删除缓冲区中最后一个字符 然后多次询问第$x$个被打印出来的串在 ...

  3. BZOJ 2434 阿狸的打字机(fail树)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2434 题意:阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28 ...

  4. bzoj 2434: 阿狸的打字机 fail树+离线树状数组

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2434 题解: 首先我们可以发现这个打字的过程本身就是在Trie上滚来滚去的过程 所以我们 ...

  5. bzoj 2434 阿狸的打字机 fail树的性质

    如果a串是另b串的后缀,那么在trie图上沿着b的fail指针走一定可以走到a串. 而a串在b串里出现多少次就是它是多少个前缀的后缀. 所以把fail边反向建树维护个dfs序就行了. 并不是很难... ...

  6. BZOJ 2434 阿狸的打字机 | AC自动机

    题目戳这里 AC自动机上有神奇的东西叫做fail指针--所有fail指针连起来恰好构成一棵以1为根的树! 而这道题问x在y中出现过多少次,就是问Trie树上根到y的结束节点的路径上有多少节点能通过跳f ...

  7. [NOI 2011][BZOJ 2434] 阿狸的打字机

    传送门 AC自动机 + 树状数组 建成AC自动机后,设end[i]为第i个串的末尾在Trie树上的节点. 可以发现,对于一个询问(x,y),ans等于Trie树上root到end[y]这条链上fail ...

  8. BZOJ 2434 阿狸的打字机(ac自动机+dfs序+树状数组)

    题意 给你一些串,还有一些询问 问你第x个串在第y个串中出现了多少次 思路 对这些串建ac自动机 根据fail树的性质:若x节点是trie中root到t任意一个节点的fail树的祖先,那么x一定是y的 ...

  9. 【BZOJ】【2434】【NOI2011】阿狸的打字机

    AC自动机+DFS序+BIT 好题啊……orz PoPoQQQ 大爷 一道相似的题目:[BZOJ][3172][TJOI2013]单词 那道题也是在fail树上数有多少个点,只不过这题是在x的fail ...

随机推荐

  1. ALS数学点滴

    其中,$n_{u_i}$表示用户$i$评分的电影数目,$n_{m_j}$表示对电影$j$评分的用户数目.设$I_i$表示用户$i$所评分的电影集合,则$n_{u_i}$是$I_i$的基数,同样的,$I ...

  2. Win7下Qt5.2中使用OpenGL的glu函数库无法使用的解决方案

          最近在Window7使用Qt5.2学习OpenGL时,出现了以OpenGL中glu开头的函数库无法使用的错误,例如: 'gluPerspective'  was not declared ...

  3. Android中实现跨app之间数据的暴露与接收

    例如一个小项目:实现单词本的添加单词等功能 功能:不同的方式实现跨app之间数据的暴露与接收 暴露端app:实现单词的添加(Word.Translate),增删改查: 接收端app:模糊查询,得到暴露 ...

  4. struts.enable.DynamicMethodInvocation = true 动态方法调用(转)

    原文地址:http://blog.csdn.net/wfcaven/article/details/5937557 default.properties 在Struts 2的核心jar包-struts ...

  5. 登录网站爬虫(保持Cookie不变)

    平时经常需要到学校的信息门户去查看课表及其他信息,于是想做一个爬虫 ,可以自动替我登录并且得到这些信息,于是今天动手写了一个爬虫: 首先登录学校的信息门户:http://cas.whu.edu.cn/ ...

  6. xUtils3源码分析(一):view的绑定

    概述 xUtils3是国人开发的一款功能丰富的Android快速开发框架,值得研究下.zip包下载:[ZIP]xutils主要分以下几个模块 视图绑定模块 网络请求模块 数据库模块 图片加载模块 我们 ...

  7. DataTable数据与Excel表格的相互转换

    using Excel = Microsoft.Office.Interop.Excel; private static Excel.Application m_xlApp = null; /// & ...

  8. 获取Html中所有img的src

    /// <summary> /// 获取所有Img中的Src /// </summary> /// <param name="htmlText"> ...

  9. html.day01

    1.web标准: 1. 结构  (xhtml)  2. 表现(css)  3.行为(js) html   超文本标记语言 xhtml  (严格型超文本标记语言) 2.规范: 1. 所有标签(标记)都要 ...

  10. C# - 二叉树表达式计算

    很早以前就写过双栈的表达式计算. 这次因为想深入学一下二叉树,网上都是些老掉牙的关于二叉树的基本操作. 感觉如果就学那些概念,没意思也不好记忆.于是动手写了一个表达式计算的应用例子. 这样学习印象才深 ...