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. 日期控件,layui

    <link rel="stylesheet" href="<%=path%>/layui/css/layui.css" type=" ...

  2. maven添加本地jar包

    今天遇到一个mavan仓库中没有的jar包, 故只能添加本地jar包, 花了不少时间找资料,终于OK.故在此记录. 1. 第一次,在网上看到说可以用<systemPath> 解决, 如下: ...

  3. touch的属性

    touch命令:建立文件   touch的功能并不是用来创建新文件的,创建文件是touch命令的一个特殊情况,touch是用来修改指定的文件的访问和修改时间属性,如果指定的文件不存在,将建立一个新的空 ...

  4. Microsoft.Office.Interop.Excel操作Excel文件时出现的问题及解决方案

    问题描述: Microsoft.Office.Interop.Excel.Worksheet 打不开文件 Microsoft Office Excel 不能访问文件"a.xls". ...

  5. php基础_字符串

    1.字符串去掉空格 trim() ltrim() rtrim() 2.字符串的大小写更改 strtoupper():全部转成大写     // aAA bBB 变成 AAA BBB strtolowe ...

  6. C# 发送HttpWebRequest获得网络图片的大小、尺寸

    可以通过HttpWebRequest的方式发送一个网络图片的请求,再通过HttpWebResponse接收返回的数据,分析数据流得到图片的大小以及尺寸,代码如下: /// <summary> ...

  7. 转: Hibernate HQL查询 插入 更新(update)实例

    1.实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql=”from User user ”;List list=session.CreateQuery(hq ...

  8. ImageLoader1

    package com.bawei.activity; import android.app.Activity; import android.graphics.Bitmap; import andr ...

  9. js动态添加行

    <script> $(function() { //增加上传 var addli = function() { var linum = parseInt($(".pic-wrap ...

  10. Coding源码学习第二部分(FunctionIntroManager.m)

    接上篇.上篇有一个细节忘了写,在Coding_iOS-Info.plist 里面添加了一个key 是 Status bar is initially hidden  Value 是 YES,在appl ...