可以把打字的过程看成trie树的构建。把trie树的AC自动机建出来,问题就是询问一个点到根的路径上,有多少点的fail会指到另一个点上。
因为fail指针是树的结构,可以沿着原操作在trie树上走,维护fail树上单点修改、子树查询的操作。按照dfs序用树状数组维护。

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=200010;
vector<int> qry[maxn],son[maxn];
char s[maxn];
int trans[maxn][30],fail[maxn],fa[maxn],que[maxn],
L[maxn],R[maxn],sum[maxn],qx[maxn],ans[maxn],
pos[maxn],
n,q,tot,num,clo;
void dfs(int u)
{L[u]=++clo;vector<int>::iterator it;for (it=son[u].begin();it!=son[u].end();it++) dfs(*it);R[u]=clo;
}
int query(int p)
{int ret=0;for (;p;p-=p&-p) ret+=sum[p];return ret;
}
void add(int p,int x)
{for (;p<=clo;p+=p&-p) sum[p]+=x;
}
int main()
{//freopen("in","r",stdin);int p=0,hd=1,tl=0,u,v;vector<int>::iterator it;scanf("%s",s+1);n=strlen(s+1);for (int i=1;i<=n;i++)if (s[i]=='P') pos[++num]=p;else if (s[i]=='B') p=fa[p];else{if (!trans[p][s[i]-'a']) fa[trans[p][s[i]-'a']=++tot]=p;p=trans[p][s[i]-'a'];}for (int i=0;i<26;i++)if (trans[0][i]) que[++tl]=trans[0][i];while (hd<=tl){u=que[hd++];for (int i=0;i<26;i++)if (trans[u][i]){que[++tl]=trans[u][i];fail[trans[u][i]]=trans[fail[u]][i];}else trans[u][i]=trans[fail[u]][i];}for (int i=1;i<=tot;i++) son[fail[i]].push_back(i);scanf("%d",&q);for (int i=1;i<=q;i++){scanf("%d%d",&u,&v);qx[i]=pos[u];qry[pos[v]].push_back(i);}dfs(0);p=0;for (int i=1;i<=n;i++)if (s[i]=='P')for (it=qry[p].begin();it!=qry[p].end();it++) ans[*it]=query(R[qx[*it]])-query(L[qx[*it]]-1);else if (s[i]=='B'){add(L[p],-1);p=fa[p];}else{p=trans[p][s[i]-'a'];add(L[p],1);}for (int i=1;i<=q;i++) printf("%d\n",ans[i]);
}

【NOI2011】bzoj2434 阿狸的打字机相关推荐

  1. 【NOI2011】阿狸的打字机

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

  2. 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组

    [BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...

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

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2434 [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory ...

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

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

  5. 2434: [Noi2011]阿狸的打字机

    2434: [Noi2011]阿狸的打字机 https://lydsy.com/JudgeOnline/problem.php?id=2434 分析: AC自动机. 查询x在y中出现了几次,就是查询y ...

  6. 【bzoj 2434】【codevs 1946】[Noi2011]阿狸的打字机(AC自动机)

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 2477  Solved: 1382 [Submit][S ...

  7. bzoj 2434 [Noi2011]阿狸的打字机(AC自动机+fail树+dfs序+树状数组)

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 3521  Solved: 1913 [Submit][S ...

  8. [NOI2011] 阿狸的打字机

    [NOI2011] 阿狸的打字机 题目描述 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有 28 28 28 个按键,分别印有 26 26 26 个小写英文字母和 B.P 两 ...

  9. P2414 NOI2011阿狸的打字机 [AC自动机,dfs序]

    阿狸的打字机 题解 题目中给出的字符串就是构建TrieTrieTrie树的顺序.我们将字符串依次读入,每读入一个小写字符就相当于在TrieTrieTrie树当前节点下插入一个小写字符,读入BBB时,就 ...

最新文章

  1. Android事件分发机制详解
  2. oracle学习-存储过程返回一个值,和返回一个结果集
  3. 图解从 URL 到网页通信原理
  4. ActiveMQ 学习(VM Transport)
  5. [翻译]More C++ Idioms - 类成员检测器
  6. as和java什么关系_深入理解happens-before和as-if-serial语义
  7. 如何学习工业机器人技术
  8. java毕业设计鸿鹄教育培训mybatis+源码+调试部署+系统+数据库+lw
  9. Sniffer报文捕获解析
  10. 系统安装部署系列教程(六):封装系统
  11. 达尔豪西大学 计算机科学,西安大略大学和达尔豪西大学哪个好
  12. 传感器与检测技术基础知识(4)—— 电阻式传感器
  13. uc投屏按钮不见了_网页投屏,网页视频怎么投屏到电视,
  14. row format delimited fields terminated by ','
  15. MSDC 4.3 接口规范(11)
  16. CSS学习之圆、半圆、四分之一圆以及三角形的创建
  17. 根文件系统与文件系统的区别
  18. ubuntu 16换源方法
  19. 基于ROS节点多机协同(无人机/无人车)分析
  20. Xshell光标消失

热门文章

  1. 时下最火的网络视频编码器传输技术
  2. 防火墙阻止了从docker容器到外部的网络连接
  3. 大学三年半的收支情况
  4. android模拟power键,android 发送模拟按键
  5. 二分法求根号二的近似值_根号2约等于多少?
  6. 如何用usb电缆连接到计算机,如何使用USB串行电缆将文件从计算机传输到树莓派...
  7. “互联网+地税大数据”提升淮安办税效能
  8. 结构体、共用体、位操作和枚举类型
  9. java短信登录_JAVA短信验证登录
  10. 当@PathVariable遇上了.