http://www.lydsy.com/JudgeOnline/problem.php?id=2434 (题目链接)

题意

  给出一个字符串,$P$表示输出,$B$表示退格。$m$组询问$(x,y)$,问第$x$个串在第$y$个串中出现了多少次。

Solution

  构出fail树,搞出dfs序,那么显然问题就转化为了自动机上匹配y时经过的节点有多少个在x的子树内,我们将询问排好序做过去树状数组单点修改维护子树和就可以了。

细节

  mdzz建ACM和查询的时候没注意,直接重新开始TLE飞了。

代码

// bzoj2434
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<ctime>
#define LL long long
#define inf (1ll<<30)
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std; const int maxn=100010;
int n,m,sz=1,cnt,dfn,pos[maxn],head[maxn],c[maxn],in[maxn],out[maxn],ans[maxn];
char ch[maxn],tmp[maxn];
struct data {int x,y,id;}q[maxn];
struct edge {int to,next;}e[maxn<<1];
struct node {
int son[26],next,fa;
int& operator [] (int x) {return son[x];}
}tr[maxn]; int lowbit(int x) {
return x&-x;
}
void add(int x,int val) {
for (int i=x;i<=sz;i+=lowbit(i)) c[i]+=val;
}
int query(int x) {
int res=0;
for (int i=x;i;i-=lowbit(i)) res+=c[i];
return res;
}
void link(int u,int v) {
e[++cnt]=(edge){v,head[u]};head[u]=cnt;
e[++cnt]=(edge){u,head[v]};head[v]=cnt;
}
void dfs(int x,int fa) {
in[x]=++dfn;
for (int i=head[x];i;i=e[i].next)
if (e[i].to!=fa) dfs(e[i].to,x);
out[x]=dfn;
}
bool cmp(data a,data b) {
return a.y<b.y;
}
void buildfail() {
queue<int> q;q.push(1);
tr[1].next=0;
while (!q.empty()) {
int x=q.front();q.pop();
for (int i=0;i<26;i++) if (tr[x][i]) {
int p=tr[x].next;
while (!tr[p][i]) p=tr[p].next;
link(tr[x][i],tr[p][i]);
tr[tr[x][i]].next=tr[p][i];
q.push(tr[x][i]);
}
}
}
int main() {
scanf("%s",ch+1);
for (int i=0;i<26;i++) tr[0][i]=1;
n=strlen(ch+1);int p=1,id=0;
for (int i=1;i<=n;i++) {
if (ch[i]=='P') pos[++id]=p;
else if (ch[i]=='B') p=tr[p].fa;
else {
if (!tr[p][ch[i]-'a']) tr[p][ch[i]-'a']=++sz;
tr[tr[p][ch[i]-'a']].fa=p;p=tr[p][ch[i]-'a'];
}
}
buildfail();
dfs(1,0);
scanf("%d",&m);
for (int i=1;i<=m;i++) scanf("%d%d",&q[i].x,&q[i].y),q[i].id=i;
sort(q+1,q+1+m,cmp);
int pp=1;id=0,p=1;
for (int i=1;i<=n;i++) {
if (ch[i]=='P') {
id++;
for (;q[pp].y==id;pp++) {
int t=pos[q[pp].x];
ans[q[pp].id]=query(out[t])-query(in[t]-1);
}
}
else if (ch[i]=='B') add(in[p],-1),p=tr[p].fa;
else p=tr[p][ch[i]-'a'],add(in[p],1);
}
for (int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}

【bzoj2434】 Noi2011—阿狸的打字机的更多相关文章

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

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

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

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

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

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

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

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

  5. BZOJ2434: [Noi2011]阿狸的打字机(AC自动机 树状数组)

    Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4140  Solved: 2276[Submit][Status][Discuss] Descript ...

  6. BZOJ2434[Noi2011]阿狸的打字机——AC自动机+dfs序+树状数组

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

  7. BZOJ2434:[NOI2011]阿狸的打字机(AC自动机,线段树)

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

  8. BZOJ2434: [Noi2011]阿狸的打字机(fail树+dfs序)

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

  9. BZOJ2434 [NOI2011] 阿狸的打字机 【树链剖分】【线段树】【fail树】【AC自动机】

    题目分析: 画一下fail树,就会发现就是x的子树中属于y路径的,把y剖分一下,用线段树处理 $O(n*log^2 n)$. 代码: #include<bits/stdc++.h> usi ...

  10. 沉迷AC自动机无法自拔之:[BZOJ2434] [Noi2011] 阿狸的打字机

    如标题所言,我已经沉迷于AC自动机无法自拔了... 这又是一道AC自动的题,红红火火恍恍惚惚 这题目做起来真舒服 简单概括一下:\(AC\)自动机\(fail\)树上树链剖分\(+\)树状数组 这种类 ...

随机推荐

  1. 2《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——操作文件

    已经学习了基本的命令,现在是时候学习操作文件了,这也是命令行的重要任务.还是基于本教程的事先规定,本教程是入门级的,不要求熟悉类似编辑文本的程序(这些文本编辑程序,将在下个系列教程中介绍, Learn ...

  2. 大数据入门第二十三天——SparkSQL(一)入门与使用

    一.概述 1.什么是sparkSQL 根据官网的解释: Spark SQL is a Spark module for structured data processing. 也就是说,sparkSQ ...

  3. 20155232《网络对抗》Exp7 网络欺诈防范

    20155232<网络对抗>Exp7 网络欺诈防范 一.实践内容 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法.具体实践有 (1)简单应用SET工具建立冒名网 ...

  4. SCC的奇葩算法——Kosaraju

    不会Tarjan,难道就不能与邪恶的SCC作斗争了吗? 祭出Kosaraju. 一些变量名的意义: a[N] 原图的vector存储 b[N] 原图的所有边反向vector存储 s dfs得出的拓扑序 ...

  5. [agc011C]Squared Graph-[二分图]

    Description 传送门 Solution 我们以下考虑的情况都是原图中非孤立的点. 题目要求新图的连通块个数.这个不好算,我们考虑计算新图的联通块内的特征点(x,y),即无法通过移动找到(t, ...

  6. openssh7.9 升级笔记

    由于全网安全检查需要,要对项目中1280台Linux系统升级SSH及openssl,其中: OPENSSH 升级为 openssh 7.9p 下载地址:  openssl 升级为 1.0.2o 下载地 ...

  7. springboot打包成war后部署项目出现异常 LifecycleException: Failed to start component

    完整异常:org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].Sta ...

  8. 【ORACLE】oracle11g dg搭建

    --------------------------------每个节点和DG------------------------------------------------------------- ...

  9. Docker部署Registry私有镜像库

    拉取镜像 docker pull registry:2.6.2   生成账号密码文件,这里采用htpasswd方式认证 docker run --rm --entrypoint htpasswd re ...

  10. C# List left join

    public class Test1 { public int ID { get; set; } public string Name { get; set; } } public class Tes ...