【题意】阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机。打字机上只有28个按键,分别印有26个小写英文字母和'B'、'P'两个字母。

经阿狸研究发现,这个打字机是这样工作的:

l 输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母加在凹槽的最后)。

l 按一下印有'B'的按键,打字机凹槽中最后一个字母会消失。

l 按一下印有'P'的按键,打字机会在纸上打印出凹槽中现有的所有字母并换行,但凹槽中的字母不会消失。

我们把纸上打印出来的字符串从1开始顺序编号,一直到n。打字机有一个非常有趣的功能,在打字机中暗藏一个带数字的小键盘,在小键盘上输入两个数(x,y)(其中1≤x,y≤n),打字机会显示第x个打印的字符串在第y个打印的字符串中出现了多少次。

【算法】AC自动机+树状数组+DFS序

【题解】首先根据操作序列建AC自动机,"B"就返回跳过来的节点,“P”就标记为一个串的结尾节点。

询问AC自动机中一个串B在另一个串A中出现几次?

从根开始走整个串A,标记到达的节点为1,那么就是询问B在fail树上的子树中有多少节点为1。

询问可以用树状数组维护DFS序来区间查询,这部分复杂度O(n log n)。那怎么修改询问串A?

将询问离线按串A的编号顺序排列(本质上是按DFS序排序),利用一个性质【对每个点入栈+1,出栈-1,那每个点到根的前缀和就是到根的路径(星系探索)】。

所以按顺序枚举串A,加入新节点+1,“B”退格-1,这些+1-1都在树状数组上单点修改,遇到询问就回答(相当于前缀和)。因为串A都是AC自动机中的串,所以不会有fail的问题。

总复杂度O(n log n)。

最新文章

  1. sql server 取文件名函数 转载
  2. let命令
  3. 前端MVVM框架avalon揭秘 - 双向绑定原理
  4. WINDOWS Composer & PHPUnit 安装记录
  5. PL/SQL Developer去掉启动时自动弹出的Logon弹出框方法
  6. [BZOJ1998][Hnoi2010]Fsk物品调度
  7. DrawTools(画图工具)原始版本
  8. 不重启mysql情况修改参数变量
  9. android 监听短信数据库,制作短信控制工具,控制别人的手机!!(一)
  10. POI操作Excel常用方法总结
  11. ExpandableListView的完美实现,JSON数据源,右边自定义图片
  12. mybatis传参的几种方式
  13. bboss oreach循环嵌套遍历map
  14. php国家或者编码英文字母排序
  15. linux上安装完torch后仍报错:ImportError: No module named torch
  16. Effective前端2---加快页面打开速度
  17. Linux学习笔记之九————ubuntu软件安装与卸载
  18. Android 接收系统广播(动态和静态)
  19. select 语法
  20. 最长公共子序列与最长公共字串 (dp)转载http://blog.csdn.net/u012102306/article/details/53184446

热门文章

  1. rpm安装和二进制安装
  2. 用delphi开发activex打印控件
  3. 微信小程序 功能函数 替换字符串内的指定字符
  4. es6 let关键字
  5. Python中pip install MySQL-python报错解决方法
  6. 利用ZooKeeper简单实现分布式锁
  7. BZOJ3158 千钧一发(最小割)
  8. D-query SPOJ - DQUERY(模板莫队)
  9. 【刷题】BZOJ 2049 [Sdoi2008]Cave 洞穴勘测
  10. Vue使用SCSS进行模块化开发