Description:

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

输入小写字母,打字机的一个凹槽中会加入这个字母(按 P 前凹槽中至少有一个字母)。 按一下印有'B'的按键,打字机凹槽中最后一个字母会消失。 按一下印有'P'的按键,打字机会在纸上打印出凹槽中现有的所有字母并换行,但凹槽中的字母不会消失(保证凹槽中至少有一个字母) 。

例如,阿狸输入 aPaPBbP,纸上被打印的字符如下:

a

aa

ab

我们把纸上打印出来的字符串从 1开始顺序编号,一直到 n。打字机有一个非常有趣的功能,在打字机中暗藏一个带数字的小键盘,在小键盘上输入两个数(x,y)(其中1≤x,y≤n),打字机会显示第x个打印的字符串在第y个打印的字符串中出现了多少次。 阿狸发现了这个功能以后很兴奋,他想写个程序完成同样的功能,你能帮助他么?

题解:

这题不如之前那题可以直接用其它的高级数据结构搞出来。

这题只可以AC自动机了。

还是之前那题的套路。

这样就相当于y在trie上的每一个前缀往fail跳多少个x。

反过来就是x往fail的子树跳有多少个是y的前缀。

这题显然可以离线。

先对fail树建dfs序,因为这样子树会在连续的一段里。

把询问打在y上,然后按trie的顺序走,询问就是了。

可以用树状数组或线段树维护。

Code:

#include<cstdio>
#include<cstring>
#define fo(i, x, y) for(int i = x; i <= y; i ++)
#define low(x) ((x) & -(x))
using namespace std;const int N = 1e5 + 5;int n, m, x, tot = 1, son[N][26], fa[N], num[N], nt; char str[N];struct Ask {int x, y;
} a[N];struct edge {int final[N], next[N], to[N], pq[N], tt;void link(int x, int y, int z) {next[++ tt] = final[x], to[tt] = y, pq[tt] = z, final[x] = tt;}
} e, ac;int ans[N];int dfn[N], td, l[N], r[N], f[N];void add(int x, int y) {while(x <= tot) f[x] += y, x += low(x);
}int find(int x) {int s = 0;while(x) s += f[x], x -= low(x);return s;
}void dfs(int x) {dfn[x] = l[x] = ++ td;for(int i = ac.final[x]; i; i = ac.next[i]) {int y = ac.to[i]; dfs(y);}r[x] = td;
}void dg(int x) {add(dfn[x], 1);fo(j, 0, 25) if(son[x][j])dg(son[x][j]);for(int i = e.final[x]; i; i = e.next[i]) {int y = e.to[i], z = e.pq[i];ans[z] = find(r[y]) - find(l[y] - 1);}add(dfn[x], -1);
}int fail[N], d[N];void Build_ac() {fo(i, 0, 25) son[0][i] = 1;d[0] = d[1] = 1;fo(i, 1, d[0]) {int x = d[i];fo(j, 0, 25) if(son[x][j]) {int y = son[x][j], z = fail[x];while(!son[z][j]) z = fail[z];fail[y] = son[z][j]; d[++ d[0]] = y;}}fo(i, 1, tot) ac.link(fail[i], i, 0);
}int main() {scanf("%s", str + 1); m = strlen(str + 1);x = 1;fo(i, 1, m) {int c = str[i];if(c == 'B') {x = fa[x];} elseif(c == 'P') {num[++ nt] = x;} else {c = c - 'a';if(!son[x][c]) fa[++ tot] = x, son[x][c] = tot;x = son[x][c];}}Build_ac();scanf("%d", &m);fo(i, 1, m) {scanf("%d %d", &a[i].x, &a[i].y);e.link(num[a[i].y], num[a[i].x], i);}dfs(1); dg(1);fo(i, 1, m) printf("%d\n", ans[i]);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

  7. [NOI2011] 阿狸的打字机

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

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

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

  9. 【bzoj2434】[Noi2011]阿狸的打字机 AC自动机+Dfs序+树状数组

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

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

    Description 打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的: ·输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母 ...

最新文章

  1. 多学一点(八)——LNMP环境搭建
  2. MacOS系统下简单安装以及配置MongoDB数据库(一)
  3. [概统]本科二年级 概率论与数理统计 第五讲 二元随机变量
  4. nginx+keepalived双master负载均衡配置
  5. Python,得到列表最小k个数或最大k个数的索引
  6. 【报错笔记】项目中使用ArrayList<>报错:‘<>’operator is not allowed for source level below 1.7
  7. C语言中open与fopen的的解释和区别
  8. 红帽企业linux4参考指南读书笔记-GRUB引导器
  9. 请问 CType和DirectCast函数有何区别
  10. 将$type添加到System.Text.Json序列化中,就像Newtonsoft那样用于动态对象属性
  11. QQ网页链接打开本地QQ.exe原理
  12. 基于java的教材管理_基于JAVA Web教材管理系统设计与实现.doc
  13. rpcbind 、nfs无法启动问题
  14. 统计推断—参数估计—点估计、区间估计、t分布、Z分布
  15. sast/dast/iast对比介绍
  16. 利用Get-FileHash工具进行哈希验证
  17. 设计模式----策略模式
  18. LINQ SelectMany cannot be inferred from the usage. Try specifying the type arguments explicitly.
  19. NIPS大会最精彩一日:AlphaZero遭受质疑;史上第一场正式辩论与LeCun激情抗辩;元学习强化学习亮点复盘...
  20. 计算方法 | 绪论和插值(详细例题)

热门文章

  1. 用计算机可以定位到手机吗,如何使用计算机定位手机的位置?
  2. html5画图论文结束语,基于HTML5 Canvas画图软件的设计与实现.doc
  3. eclipse的安装与下载
  4. 加州大学欧文分校 计算机专业,加州大学欧文分校信息与计算机科学
  5. 2019强网杯crypto writeup
  6. Java,第一次作业——六边形面积
  7. 软件测试周刊(第23期):你理想中的工作是什么?
  8. RGB色彩模型图像/像素深度
  9. 处理new Date()在safari浏览器上的某些日期格式导致的Invalid Date
  10. vue路由模板是html,vue-router 详解