Noi2011 阿狸的打字机
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 阿狸的打字机的更多相关文章
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- BZOJ 2434: [Noi2011]阿狸的打字机( AC自动机 + DFS序 + 树状数组 )
一个串a在b中出现, 那么a是b的某些前缀的后缀, 所以搞出AC自动机, 按fail反向建树, 然后查询(x, y)就是y的子树中有多少是x的前缀. 离线, 对AC自动机DFS一遍, 用dfs序+树状 ...
- [NOI2011]阿狸的打字机(好题!!!!)
2785: [NOI2011]阿狸的打字机 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 7 Solved: 3[Submit][Status][We ...
- P2414 [NOI2011]阿狸的打字机
P2414 [NOI2011]阿狸的打字机 AC自动机+树状数组 优质题解 <------题目分析 先AC自动机搞出Trie图 然后根据fail指针建一只新树 把树映射(拍扁)到一个序列上,用树 ...
- 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组
[BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...
- [NOI2011]阿狸的打字机 --- AC自动机 + 树状数组
[NOI2011] 阿狸的打字机 题目描述: 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机. 打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现, ...
- BZOJ2434 [Noi2011]阿狸的打字机 【AC自动机 + fail树 + 树状数组】
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 3610 Solved: 1960 [Submit][S ...
- BZOJ2434: [NOI2011]阿狸的打字机(AC自动机+dfs序+树状数组)
[NOI2011]阿狸的打字机 题目链接:https://www.luogu.org/problemnew/show/P2414 题目背景 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机. ...
- bzoj 2434 [Noi2011]阿狸的打字机 AC自动机
[Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4001 Solved: 2198[Submit][Status][D ...
- 洛谷 P2414 [NOI2011]阿狸的打字机 解题报告
P2414 [NOI2011]阿狸的打字机 题目背景 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机. 题目描述 打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母 ...
随机推荐
- 网站第三方登陆(一) QQ登陆
QQ 登陆是指,通过qq的用户名和密码,登录网站,不需要注册,网站的用户名和密码.如下图 一旦你授权了,就可以进入网站了,要实现这个效果 1.去qq互联平台(http://connect.qq.com ...
- Oracle 乱码
导入DMP之后 ..... 1.Oacle数据库表中数据乱码 请检查导出DMP的ORACLE数据库编码设置 修改ORACLE编码与原DMP导出编码一致 select userenv('language ...
- Mvc 提交表单的4种方法全程详解
一,MVC HtmlHelper方法 Html.BeginForm(actionName,controllerName,method,htmlAttributes){} BeginRouteForm ...
- 深入剖析tomcat 笔记——第8章 载入器
深入剖析tomcat 笔记 目录:
- 关于ADO.NET 超时的问题
前几天超时问题困扰我很头疼. 为什么我设置了链接字符串的超时时间很长,可是等了一小会就报错Timeout了? connectionString="Data Source=.;Initial ...
- python二进制相关
https://docs.python.org/3/library/struct.html#module-struct
- 编译GCC4.8.2
公司的机器上默认是GCC4.4.6,为了完整的体验C++11,可以自己编译一个GCC4.8.2出来(自带了更高版本的glibc). 以下是备忘. 1.下载GCC源码以及依赖库 gmp ftp: ...
- 【思路】-分页-双top分页算法的原理
描述:实现分页的一种算法 大致过程:访客访问不同的分页,为这个当前页生成动态的查询SQL,然后送到数据库中执行 输入:总条数,每页多少条,第几页,查询的SQL,排序的字段 注意:传入的排序字段需要构成 ...
- Xcode相关整理
阅读目录 javadoc格式文档注释插件 xcodekit插件 常用快捷键 XCode中快捷健字符与MAC键盘对应关系: 添加自动生成格式为javadoc文档注释的插件VVDocumenter 首先推 ...
- 第一篇博客:Hello World
2016年10月10日,双十,好日子,决定开始写第一篇博客,标题想了会,就叫Hello World 吧,哈哈^_^. 首先感谢博客园的管理们能批准我的申请,记得在14年的时候申请过一次,竟然没申请通过 ...