2434: [Noi2011]阿狸的打字机 - BZOJ
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
首先我们建出ac自动机,然后对于一组询问(x,y)就是从根到y字符串这条路径有多少点可以通过fail走到x节点,然后fail反向建出来的是一棵树(就叫fail树算了)
于是一组询问(x,y)就是从根到y字符串这条路径有多少点在x节点的子树中,于是我们处理出dfs序,我们就只要维护区间和就行了
对于多组询问我们就离线处理,按照他打字机的顺序遍历点,小写字母就在他的dfs序上+1,B就在现在这个节点的dfs序上-1,走到x单词的结束节点时处理询问(i,x)
const
maxn=;
type
node=record
x,y,id:longint;
end;
var
go:array[..maxn,'a'..'z']of longint;
q:array[..maxn]of node;
ch:array[..maxn]of char;
e,p,fa,ll,rr,ans,fail,first,last,next,bit:array[..maxn]of longint;
n,cnt,tot,now,sum:longint;
s:ansistring; procedure insert(x,y:longint);
begin
inc(tot);
last[tot]:=y;
next[tot]:=first[x];
first[x]:=tot;
end; function nexts(x:longint;c:char):longint;
begin
if go[x,c]= then
begin
inc(cnt);go[x,c]:=cnt;
fa[cnt]:=x;ch[cnt]:=c;
end;
exit(go[x,c]);
end; procedure swap(var x,y:node);
var
t:node;
begin
t:=x;x:=y;y:=t;
end; procedure sort(l,r:longint);
var
i,j,y:longint;
begin
i:=l;j:=r;y:=q[(l+r)>>].x;
repeat
while q[i].x<y do inc(i);
while q[j].x>y do dec(j);
if i<=j then
begin
swap(q[i],q[j]);
inc(i);dec(j);
end;
until i>j;
if i<r then sort(i,r);
if j>l then sort(l,j);
end; procedure dfs(x:longint);
var
i:longint;
begin
inc(sum);ll[x]:=sum;
i:=first[x];
while i<> do
begin
dfs(last[i]);
i:=next[i];
end;
rr[x]:=sum;
end; var
que:array[..maxn]of longint;
l,r:longint; procedure bfs;
var
i,j:longint;
c:char;
begin
que[]:=;l:=;r:=;
while l<=r do
begin
for c:='a' to 'z' do
if go[que[l],c]> then
begin
inc(r);
que[r]:=go[que[l],c];
end;
inc(l);
end;
for i:= to cnt do
begin
j:=que[i];c:=ch[j];j:=fail[fa[j]];
while (j<>) and (go[j,c]=) do
j:=fail[j];
fail[que[i]]:=go[j,c];
if fail[que[i]]=que[i] then fail[que[i]]:=;
insert(fail[que[i]],que[i]);
end;
end; function get(x:longint):longint;
begin
get:=;
while x> do
begin
inc(get,bit[x]);
x:=x-(x and (-x));
end;
end; procedure add(x,y:longint);
begin
while x<=sum do
begin
inc(bit[x],y);
x:=x+(x and (-x));
end;
end; procedure main;
var
i,j:longint;
begin
readln(s);now:=;
for i:= to length(s) do
begin
if s[i]='P' then
begin
inc(n);
e[n]:=i;
p[n]:=now;
end
else
if s[i]='B' then now:=fa[now]
else now:=nexts(now,s[i]);
end;
bfs;
dfs();
read(n);
for i:= to n do
read(q[i].y,q[i].x);
for i:= to n do q[i].id:=i;
sort(,n);
j:=;now:=;
for i:= to n do
begin
while j<e[q[i].x] do
begin
inc(j);
if s[j]='B' then
begin
add(ll[now],-);
now:=fa[now];
end
else
if s[j]<>'P' then
begin
now:=nexts(now,s[j]);
add(ll[now],);
end;
end;
ans[q[i].id]:=get(rr[p[q[i].y]])-get(ll[p[q[i].y]]-);
end;
for i:= to n do writeln(ans[i]);
end; begin
main;
end.
2434: [Noi2011]阿狸的打字机 - BZOJ的更多相关文章
- 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序+树状 ...
- bzoj 2434 [Noi2011]阿狸的打字机 AC自动机
[Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4001 Solved: 2198[Submit][Status][D ...
- 【BZOJ】2434: [Noi2011]阿狸的打字机 AC自动机+树状数组+DFS序
[题意]阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的: l 输入小写 ...
- 【刷题】BZOJ 2434 [Noi2011]阿狸的打字机
Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的 ...
- BZOJ 2434: [Noi2011]阿狸的打字机 AC自动机+fail树+线段树
Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的 ...
- bzoj 2434 [Noi2011]阿狸的打字机(fail树+离线处理+BIT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2434 [题意] 按照一定规则生成n个字符串,回答若干个询问:(x,y),问第x个字符串 ...
- BZOJ 2434 [Noi2011]阿狸的打字机(AC自动机)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2434 [题目大意] 给出一个打印的过程,'a'-'z'表示输入字母,P表示打印该字符串 ...
- bzoj 2434 [Noi2011]阿狸的打字机——AC自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2434 dfs AC自动机,走过的点权值+1,回溯的时候权值-1:走到询问的 y 串的节点,看 ...
随机推荐
- Android 手势滑动,多点触摸放大缩小图片
效果展示: 基本思路: <1>首先写一个图片控制类ImageControl,实现对图片控制的的基本操作,我们的图片控制类ImageControl是继承自ImageView自定义的视图: & ...
- TrineaAndroidCommon API Guide
android-common-lib 关于我,欢迎关注微博:Trinea 主页:trinea.cn 邮箱:trinea.cn#gmail.com 微信:codek2 主要包括:缓存( ...
- 用viewpager实现图片轮播
应用中常常遇到图片轮播的需求,这时候就需要用到viewpager这个组件.viewpager是android support v4 中提供的一个组件.viewpager使用需要以下几步骤: 1.在布局 ...
- 学习 AngularJS 第一天
AngularJS 高级程序设计 遇到问题:安装web服务器 var connect = require("connect"); connect.createServer( con ...
- DailyWallpaper - V1.01 released
桌面每日一图 最近发现美国国家地理网站上有个photo of the day很不错,地址在这里.http://photography.nationalgeographic.com/photograph ...
- 安装php-posix
1.安装php-posix 1 yum -y install php-process 2.验证是否安装上了 1 php -m|grep posix 1 posix
- WIN2003跳出res://C:WINDOWSsystem32mys.dll/mys.hta解决方法
出现这个问题的时候 @echo off 请将以下语句复制到记事本中,另存为后缀为.cmd的文件,并运行.当然在命令行下一句句运行也没问题. echo 正在修复,这个过程可能需要几分钟,请稍候…… ru ...
- Ubuntu下设置Tomcat成为服务(开机启动)
1.将tomcat安装目录下bin文件夹中的catalina.sh拷贝到/etc/init.d下并修改名称为tomcat cp /path/to/tomcat/bin/catalina.sh /et ...
- 基于php下载文件的详解
本篇文章是对php下载文件进行了详细的分析介绍,需要的朋友参考下 php下载文件,比如txt文件. 出现的效果就是,弹出浏览器自带的下载框,出现另存为操作.有时候会出现内存溢出和超时的现象. 超时的话 ...
- java 高精度
package BigDecimal; import java.math.BigDecimal; import java.lang.Object; public class BigDecimalTes ...