var g1,g2,g3,next,last,en,tail:array[..] of longint;
e,q,fa,ps,pt,fail,ans:array[..] of longint;
trie:array[..,..] of longint;
c:array[..] of longint;
s:array[..] of char;
tot,size,len,len1,len2,l,r,n:longint;
//============================================================================
procedure ins(x,y:longint);
begin
inc(len1); g1[len1]:=y;
next[len1]:=en[x]; en[x]:=len1;
end;
//============================================================================
procedure insert(x,y,z:longint); //本来打算对询问排序一下一起搞的。。看到网上建图的奇葩做法顿觉我弱爆了。。。
begin
inc(len2); g2[len2]:=y; g3[len2]:=z;
last[len2]:=tail[x]; tail[x]:=len2;
end;
//============================================================================
procedure add(x,y:longint); //树状数组的修改操作。(添加和取消标号一起搞,加上±)
begin
while x<=size do
begin
inc(c[x],y);
inc(x,x and -x);
end;
end;
//============================================================================
function sum(x:longint):longint; //树状数组的求和操作。
begin sum:=;
while x> do
begin
inc(sum,c[x]);
dec(x,x and -x);
end;
end;
//============================================================================
procedure init;
var now,tmp:longint;
ch:char;
begin
read(ch); tot:=; now:=; n:=;
while ch in ['B','P','a'..'z'] do
begin
inc(len); s[len]:=ch;
if ch='B' then now:=fa[now] else
if ch='P' then
begin
inc(n); e[n]:=now;
end else
begin
tmp:=ord(ch)-ord('a')+;
if trie[now,tmp]<> then now:=trie[now,tmp] else //建立trie树。
begin
inc(tot); trie[now,tmp]:=tot;
fa[tot]:=now; now:=tot;
end;
end; read(ch);
end;
end;
//============================================================================
procedure get_fail; //生成失败指针。顺便反向建树。
var g,h,i,j,now:longint;
tmp:char;
begin
l:=; r:=; fail[]:=;
for i:= to do //后来写的一个AC自动机引入一个-点貌似在求失败指针的时候更简洁。
begin
if trie[,i]<> then
begin
inc(r); q[r]:=trie[,i];
fail[q[r]]:=; ins(,q[r]); //建树。
end;
end;
while l<=r do
begin g:=r;
for h:=l to g do
begin now:=q[h];
for i:= to do
begin
if trie[now,i]<> then
begin
inc(r); q[r]:=trie[now,i]; j:=fail[now];
while j<> do
if trie[j,i]<> then
begin
fail[q[r]]:=trie[j,i];
ins(trie[j,i],q[r]); break; //建树。
end else j:=fail[j];
if j= then
begin
fail[q[r]]:=;
ins(,q[r]);
end;
end;
end;
end; l:=g+;
end;
end;
//============================================================================
procedure dfs(x:longint); //求dfs序。
var i:longint;
begin
inc(size); ps[x]:=size; i:=en[x];
while i<> do
begin
dfs(g1[i]); i:=next[i];
end;
inc(size); pt[x]:=size; //弹出的时候我也加入了。可以不用的貌似。
end;
//============================================================================
procedure main;
var x,y,i,j,m,now,tmp:longint;
begin
readln(m);
for i:= to m do
begin
readln(x,y);
insert(y,x,i); //这样就把询问分类了。OTZ...
end;
now:=; tmp:=;
for i:= to len do
begin
if s[i]='P' then
begin j:=tail[tmp];
while j> do
begin
ans[g3[j]]:=sum(pt[e[g2[j]]])-sum(ps[e[g2[j]]]-);
j:=last[j];
end; inc(tmp);
end else
if s[i]='B' then
begin
add(ps[now],-); //标记的时候只要标记在dfs序中先出现的点。(其实都一样,只要标任一个)
now:=fa[now];
end else
begin
now:=trie[now,ord(s[i])-ord('a')+];
add(ps[now],);
end;
end;
for i:= to m do writeln(ans[i]);
end;
//============================================================================
begin
assign(input,'type.in');
assign(output,'type.out');
reset(input); rewrite(output);
init;
get_fail;
dfs();
main;
close(input); close(output);
end.

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

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

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

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

    一个串a在b中出现, 那么a是b的某些前缀的后缀, 所以搞出AC自动机, 按fail反向建树, 然后查询(x, y)就是y的子树中有多少是x的前缀. 离线, 对AC自动机DFS一遍, 用dfs序+树状 ...

  3. [NOI2011]阿狸的打字机(好题!!!!)

    2785: [NOI2011]阿狸的打字机 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 7  Solved: 3[Submit][Status][We ...

  4. P2414 [NOI2011]阿狸的打字机

    P2414 [NOI2011]阿狸的打字机 AC自动机+树状数组 优质题解 <------题目分析 先AC自动机搞出Trie图 然后根据fail指针建一只新树 把树映射(拍扁)到一个序列上,用树 ...

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

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

  6. [NOI2011]阿狸的打字机 --- AC自动机 + 树状数组

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

  7. BZOJ2434 [Noi2011]阿狸的打字机 【AC自动机 + fail树 + 树状数组】

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

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

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

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

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

  10. 洛谷 P2414 [NOI2011]阿狸的打字机 解题报告

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

随机推荐

  1. ubuntu 14.04 64位安装iNodeClient

    ubuntu 14.04 64位安装iNodeClieng(华三校园客服端) http://pan.baidu.com/s/12dpxk ubuntu 14.04 64bit Install H3C ...

  2. WinDbg 蓝屏dump分析教程

    一.WinDbg是什么?它能做什么? WinDbg是在windows平台下,强大的用户态和内核态调试工具.它能够通过dmp文件轻松的定位到问题根源,可用于分析蓝屏.程序崩溃(IE崩溃)原因,是我们日常 ...

  3. Android studio下gradle Robolectric单元测试配置

    android studio下gradle Robolectric单元测试配置 1.Robolectric Robolectric是一个基于junit之上的单元测试框架.它并不依赖于Android提供 ...

  4. Ubuntu: ImportError: No module named xgboost

    ImportError: No module named xgboost 解决办法: git clone --recursive https://github.com/dmlc/xgboost cd ...

  5. TranslateAnimation 运行动画后实际位置不正确问题

    最近在调试android 动画时候发现一个很奇怪问题,网上搜索都说TranslateAnimation 动画运行后,实际位置要在动画结束的监听里面重新设置才会正确,不然物体位置还是在原位. 我根据网上 ...

  6. Mac OS 下 mysql 找不到 mysql.sock 的问题

    mysql.sock 无法找到一般存在两种问题,一是mysql服务未启动,mysql.sock没有生成,二是mysql.sock的指向位置出错,在指向位置加个mysql.sock的软链接就可以解决. ...

  7. HttpHandler

    HttpHandler初探 一.HttpHandler简介 HttpHandler是asp.net真正处理Http请求的地方.在这个HttpHandler容器中,ASP.NET Framework才真 ...

  8. css3 transfrom变换

    Transform 转换 CSS3中的转换允许我们对元素进行旋转.缩放.移动或倾斜,它分为2D转换 或3D转换 在CSS2时代,如果要做一些图片转换角度,都依赖于图片.flash或JavaScript ...

  9. iOS开发——加载、滑动翻阅大量图片解决方案详解

    加载.滑动翻阅大量图片解决方案详解     今天分享一下私人相册中,读取加载.滑动翻阅大量图片解决方案,我想强调的是,编程思想无关乎平台限制. 我要详细说一下,在缩略图界面点击任意小缩略图后,进入高清 ...

  10. pwnable.kr-random

    题目 首先我们要对rand&srand有个总体的看法:srand初始化随机种子,rand产生随机数,下面将详细说明. rand(产生随机数) 表头文件: #include 定义函数 :int ...