利用了bzoj3172提到的性质,x串在y串中的出现的次数即为在fail树上以x结尾节点为根的子树中有多少个节点在y串上
所以很明显我们要离线解决,我们先把询问按y分类存起来
然后我们顺着操作顺序来,出现一个字符就把fail树上对应节点标为1,删除之后就改为0;
当一个串输出之后,我们就统计跟他有关的询问(查询x串结尾节点子树和)
这种问题显然用dfs序+树状数组解决

 const maxn=;
type node=record
y,next:longint;
end; var i,j,n,m,len,tot,all,k,ll,rr,num,x,y,p:longint;
t:array[..maxn,'a'..'z'] of longint;
q,pre,f,v,l,d,h,r,h2,ans,st,sum:array[..maxn] of longint;
g,g2:array[..maxn] of node;
c:char;
s:array[..maxn] of char; procedure add(x,y:longint);
begin
inc(num);
g[num].y:=y;
g[num].next:=h[x];
h[x]:=num;
end; procedure ac;
begin
fillchar(q,sizeof(q),);
ll:=;
rr:=;
for c:='a' to 'z' do
if t[,c]> then
begin
add(,t[,c]);
inc(rr);
q[rr]:=t[,c];
end;
while ll<>rr do
begin
inc(ll);
i:=q[ll];
for c:='a' to 'z' do
if t[i,c]> then
begin
k:=t[i,c];
inc(rr);
q[rr]:=k;
j:=f[i];
while (j>) and (t[j,c]=) do j:=f[j];
f[k]:=t[j,c];
add(t[j,c],k);
end;
end;
end; procedure dfs(x:longint);
var p:longint;
begin
inc(tot);
l[x]:=tot;
p:=h[x];
while p<> do
begin
dfs(g[p].y);
p:=g[p].next;
end;
r[x]:=tot;
end; procedure ins(x,y:longint);
begin
g2[i].y:=y;
g2[i].next:=h2[x];
h2[x]:=i;
end; procedure change(x,y:longint);
begin
while x<=tot do
begin
inc(sum[x],y);
inc(x,x and -x);
end;
end; function get(x:longint):longint;
begin
get:=;
while x> do
begin
inc(get,sum[x]);
dec(x,x and -x);
end;
end; procedure main;
begin
readln(n);
for i:= to n do
begin
readln(x,y);
ins(y,x);
end;
j:=;k:=;m:=;
for i:= to len do
begin
case s[i] of
'B':begin change(l[st[k]],-);dec(k);j:=pre[j];end;
'P':
begin
inc(m);p:=h2[m];
while p<> do
begin
ans[p]:=get(r[d[g2[p].y]])-get(l[d[g2[p].y]]-);
p:=g2[p].next;
end;
end;
else begin
j:=t[j,s[i]];
inc(k);st[k]:=j;
change(l[j],);
end;
end;
end;
for i:= to n do writeln(ans[i]);
end; begin
j:=;
while not eoln do
begin
inc(len);
read(s[len]);
case s[len] of
'B':begin j:=pre[j];end;
'P':begin inc(tot);d[tot]:=j;v[j]:=;end;
else begin
if t[j,s[len]]= then
begin
inc(all);
t[j,s[len]]:=all;
pre[all]:=j;
end;
j:=t[j,s[len]];
end;
end;
end;
readln;
ac;
tot:=;
dfs();
main;
end.

bzoj2434的更多相关文章

  1. 【BZOJ2434】阿狸的打字机(AC自动机,树状数组)

    [BZOJ2434]阿狸的打字机(AC自动机,树状数组) 先写个暴力: 每次打印出字符串后,就插入到\(Trie\)树中 搞完后直接搭\(AC\)自动机 看一看匹配是怎么样的: 每次沿着\(AC\)自 ...

  2. 【BZOJ2434】【NOI2011】阿狸的打字机(AC自动机,树状数组)

    [BZOJ2434]阿狸的打字机(AC自动机,树状数组) 先写个暴力: 每次打印出字符串后,就插入到\(Trie\)树中 搞完后直接搭\(AC\)自动机 看一看匹配是怎么样的: 每次沿着\(AC\)自 ...

  3. 【bzoj2434】 Noi2011—阿狸的打字机

    http://www.lydsy.com/JudgeOnline/problem.php?id=2434 (题目链接) 题意 给出一个字符串,$P$表示输出,$B$表示退格.$m$组询问$(x,y)$ ...

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

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

  5. 【bzoj2434】: [Noi2011]阿狸的打字机 字符串-AC自动机-BIT

    [bzoj2434]: [Noi2011]阿狸的打字机 x串在y串上的匹配次数就是y在自动机所有节点上能够通过fail走到x最后一个节点的个数 (就是y串任意一个前缀的后缀能匹配到x的个数)和[bzo ...

  6. 【BZOJ2434】阿狸的打字机(fail树,DFS序)

    题意: 1<=N<=10^5 1<=M<=10^5 输入总长<=10^5   思路: From http://blog.csdn.net/lych_cys/article ...

  7. Bzoj2434 [Noi2011]阿狸的打字机

    Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2536  Solved: 1415 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到 ...

  8. BZOJ2434 [Noi2011]阿狸的打字机(AC自动机 + fail树 + DFS序 + 线段树)

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

  9. 【BZOJ-2434】阿狸的打字机 AC自动机 + Fail树 + DFS序 + 树状数组

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

随机推荐

  1. Android Toast 设置到屏幕中间,自定义Toast的实现方法,及其说明

    http://blog.csdn.net/wangfayinn/article/details/8065763 Android Toast用于在手机屏幕上向用户显示一条信息,一段时间后信息会自动消失. ...

  2. 解构控制反转(IoC)和依赖注入(DI)

    1.控制反转 控制反转(Inversion of Control,IoC),简言之就是代码的控制器交由系统控制,而不是在代码内部,通过IoC,消除组件或者模块间的直接依赖,使得软件系统的开发更具柔性和 ...

  3. C#查询当前微信自定义菜单结构

    查询 string access_token = "你的token"; string posturl = "https://api.weixin.qq.com/cgi-b ...

  4. .Net Framework 开发Http协议

    一.Http的基本原理 1.HTTP协议的运作方式 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HTTP协议是基于请求/响应范式的.一个客户机与服务器建立连接后,发送一个请求 ...

  5. JavaScript学习笔记 -- ES6学习(三) 变量的解构赋值

    1.解构赋值的定义 在ES6中,允许按照一定模式,从数组和对象中提取值(所谓解构),然后对变量进行赋值. var a = 1; var b = 2; var c = 3; //等价于 var [a, ...

  6. Web用户自定义控件

    在新建项的时候,选择Web用户控件,可用来自定义自己的控件,做好后,直接拖到页面即可使用自定义控件与WEB交互,需要在 自定义控件里面 写 属性,如: public string CityID { g ...

  7. sed工具使用

    sed命令使用形式 1.sed命令从管道中读取数据处理 command | sed ' edit command' 通过管道把一个命令的标准输出读入到sed的标准输入,sed就起到了过滤作用 2.se ...

  8. nodejs -mysql模块链接数据库创建库创建表单。

    var mysql = require('mysql'); var connection= mysql.createConnection({ host:'localhost', user:'root' ...

  9. VS建立可供外部调用的MFC类DLL,C#调用MFC调用

    建立MFC DLL工程.一般选共享MFC库 关键是在你生成的CPP中,添加外部调用的接口 如下,意思是将这个函数对外公开. 如果你希望对外提供类,就把这个方法做成工厂. 如果你希望对外提供MFC的窗体 ...

  10. 搭建LNMP发布ecshop系统及压测启用opcache缓存与否的情况

    安装环境:CENTOS6.5,nginx1.6.2,php-5.5.18,mysql5.5.38 在安装软件之前安装epel源,就可以直接用yum安装libmcrypt,mhash,mcrypt等ph ...