一个串a在b中出现, 那么a是b的某些前缀的后缀, 所以搞出AC自动机, 按fail反向建树, 然后查询(x, y)就是y的子树中有多少是x的前缀. 离线, 对AC自动机DFS一遍, 用dfs序+树状数组维护, DFS到的查询点就回答询问.时间复杂度O(|ACAM|+QlogQ)

-------------------------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cctype>
 
using namespace std;
 
#define chk(c) ((c <= 'z' && c >= 'a') || (c =='P') || (c == 'B'))
#define C(c) (c - 'a')
 
const int maxn = 100009;
const int c = 26;
 
inline int read() {
char c = getchar();
for(; !isdigit(c); c = getchar());
int ret = 0;
for(; isdigit(c); c = getchar())
ret = ret * 10 + c - '0';
return ret;
}
 
struct Node {
Node *ch[c], *fail, *par;
int v, d;
Node() : v(0) {
memset(ch, 0, sizeof ch);
fail = par = 0;
}
} pool[maxn], *V[maxn], *pt = pool, *Rt;
 
struct Q {
int d, x, y;
inline void Read(int _d) {
d = _d;
x = read();
y = read();
}
bool operator < (const Q &o) const {
return y < o.y;
}
} q[maxn];
 
int n, dfsn, qn;
int L[maxn], R[maxn], ql[maxn], qr[maxn], ans[maxn];
 
void Init() {
int cnt = dfsn = n = 0;
pt->d = n++;
Rt = pt++;
Node* t = Rt;
char c = getchar();
for(; !chk(c); c = getchar());
for(; chk(c); c = getchar()) {
if(c == 'P') {
V[t->v = ++cnt] = t;
} else if(c == 'B') {
t = t->par;
} else {
if(!t->ch[C(c)]) {
pt->par = t;
pt->d = n++;
t->ch[C(c)] = pt++;
}
t = t->ch[C(c)];
}
}
scanf("%d", &qn);
for(int i = 0; i < qn; i++) 
q[i].Read(i);
sort(q, q + qn);
memset(ql, 0, sizeof(int) * (cnt + 1));
memset(qr, -1, sizeof(int) * (cnt + 1));
for(int i = 0; i < qn; i++) {
if(!i || q[i - 1].y != q[i].y)
ql[q[i].y] = i;
if(i + 1 == qn || q[i + 1].y != q[i].y)
qr[q[i].y] = i;
}
}
 
struct edge {
int to;
edge* next;
} E[maxn << 1], *Pt = E, *head[maxn];
 
inline void AddEdge(int u, int v) {
Pt->to = v;
Pt->next = head[u];
head[u] = Pt++;
}
 
queue<Node*> que;
 
void buildFail() {
que.push(Rt);
while(!que.empty()) {
Node* t = que.front(); que.pop();
if(t->fail)
AddEdge(t->fail->d, t->d);
for(int i = 0; i < c; i++) if(t->ch[i]) {
Node* f = t->fail;
while(f && !f->ch[i])
f = f->fail;
t->ch[i]->fail = f ? f->ch[i] : Rt;
que.push(t->ch[i]);
}
}
}
 
struct BIT {
int b[maxn];
BIT() {
memset(b, 0, sizeof b);
}
inline void Add(int x, int v) {
for(; x <= n; x += x & -x)
b[x] += v;
}
inline int Sum(int x) {
int ret = 0;
for(; x; x -= x & -x)
ret += b[x];
return ret;
}
inline int Query(int l, int r) {
return Sum(r) - Sum(l - 1);
}
} Bit;
 
void DFS(int x) {
L[x] = ++dfsn;
for(edge* e = head[x]; e; e = e->next) DFS(e->to);
R[x] = dfsn;
}
 
void dfsAC(Node* t) {
Bit.Add(L[t->d], 1);
if(t->v) {
for(int i = ql[t->v]; i <= qr[t->v]; i++)
ans[q[i].d] = Bit.Query(L[V[q[i].x]->d], R[V[q[i].x]->d]);
}
for(int i = 0; i < c; i++)
if(t->ch[i]) dfsAC(t->ch[i]);
Bit.Add(L[t->d], -1);
}
 
int main() {
Init();
buildFail();
DFS(0);
dfsAC(Rt);
for(int i = 0; i < qn; i++)
printf("%d\n", ans[i]);
return 0;
}

-------------------------------------------------------------------------------------------

2434: [Noi2011]阿狸的打字机

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 1706  Solved: 974
[Submit][Status][Discuss]

Description

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

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

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

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

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

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

a

aa

ab

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

阿狸发现了这个功能以后很兴奋,他想写个程序完成同样的功能,你能帮助他么?

Input

输入的第一行包含一个字符串,按阿狸的输入顺序给出所有阿狸输入的字符。

第二行包含一个整数m,表示询问个数。

接下来m行描述所有由小键盘输入的询问。其中第i行包含两个整数x, y,表示第i个询问为(x, y)。

Output

输出m行,其中第i行包含一个整数,表示第i个询问的答案。

Sample Input

aPaPBbP

3

1 2

1 3

2 3

Sample Output

2

1

0

HINT

1<=N<=10^5

1<=M<=10^5

输入总长<=10^5

Source

BZOJ 2434: [Noi2011]阿狸的打字机( AC自动机 + DFS序 + 树状数组 )的更多相关文章

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

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

  2. BZOJ2434[Noi2011]阿狸的打字机——AC自动机+dfs序+树状数组

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

  3. NOI 2011 阿狸的打字机 (AC自动机+dfs序+树状数组)

    题目大意:略(太长了不好描述) 良心LOJ传送门 先对所有被打印的字符串建一颗Trie树 观察数据范围,并不能每次打印都从头到尾暴力建树,而是每遍历到一个字符就在Trie上插入这个字符,然后记录每次打 ...

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

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

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

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

  6. BZOJ_2434_[NOI2011]_阿狸的打字机_(AC自动机+dfs序+树状数组)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=2434 给出\(n\)个字符串,\(m\)个询问,对于第\(i\)个询问,求第\(x_i\)个字 ...

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

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

  8. BZOJ2434: [NOI2011]阿狸的打字机(AC自动机+dfs序+树状数组)

    [NOI2011]阿狸的打字机 题目链接:https://www.luogu.org/problemnew/show/P2414 题目背景 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机. ...

  9. CodeForces -163E :e-Government (AC自动机+DFS序+树状数组)

    The best programmers of Embezzland compete to develop a part of the project called "e-Governmen ...

随机推荐

  1. I NEED A OFFER!

    I NEED A OFFER! Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Tot ...

  2. 正式生产环境下hadoop集群的DNS+NFS+ssh免password登陆配置

    博客地址:http://www.loveweir.com/ 环境虚拟机centos6.5 主机名h1  IP 192.168.137.11  作为DNS FNS的server 主机名h2  IP 19 ...

  3. 百度Android语音识别SDK语义理解与解析方法

    百度语义理解开放平台面向互联网开发人员提供自然语言文本的解析服务,也就是能够依据文本的意图解析成对应的表示. 为了易于人阅读,同一时候也方便机器解析和生成,意图表示协议採用 json 语言进行描写叙述 ...

  4. 前端制作中,IE6还有必要兼容吗?

    国内市场对IE 6~7支持还有一定需求,但对于一个前端开发者,我们应该去推动这个行业向前发展,而不是一味迁就.妥协. 曾经,能够提供支持老版本 IE 是一个前端开发者的必备技能.随着移动互联网大潮来临 ...

  5. CentOS添加中科大、163 yum源

    首先备份CentOS-Base.repo [root@richard yum.repos.d]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos ...

  6. 创建ORACLE 查询用户

    [apptest@vis appl]$ su -oravis [oravis@vis 11.1.0]$ sqlplus / as sysdba SQL> create user erpquery ...

  7. VS中C++对象的内存布局

    本文主要简述一下在Visual Studio中C++对象的内存布局,这里没有什么测试代码,只是以图文的形式来描述一下内存分布,关于测试的代码以及C++对象模型的其他内容大家可以参考一下陈皓先生的几篇博 ...

  8. beego任务定时执行,延迟执行

    import ( "github.com/astaxie/beego" "github.com/astaxie/beego/toolbox") cronExpr ...

  9. zendstudio -chinese

    http://archive.eclipse.org/technology/babel/index.php http://www.eclipse.org/babel/downloads.php 注册码 ...

  10. MySQLdb的安装

    第一步:下载安装介质 https://pypi.python.org/pypi/MySQL-python 注意虽然模块名叫MySQLdb但是MySQL-python指的就是MySQLdb 第二步:安装 ...