http://www.lydsy.com/JudgeOnline/problem.php?id=2434

思路:建立fail树,并找出dfs序,那剩下要做的就是每次找到一个串的位置,然后询问它的区间里面有多少我当前串的节点,具体做法见代码。

#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
struct edge{int to,next,id;
}que[500005];
int fail[500005],sz,ch[500005][26],root,num,hw,low[500005],dfn[500005];
char s[500005];
int pos[500005],id,fi[500005],first[500005],next[500005],tot,go[500005];
int fa[500005],ans[500005],V[1000005],n,m;
void insert(int x,int y){tot++;go[tot]=y;next[tot]=first[x];first[x]=tot;
}
void add(int x,int v){for (int i=x;i<=hw;i+=(i)&(-i)){V[i]+=v;}
}
int query(int x){int res=0;for (int i=x;i;i-=(i)&(-i)){res+=V[i];}return res;
}
void build(){int now=1;sz=1;for (int i=0;i<n;i++){if (s[i]=='P') pos[++id]=now;elseif (s[i]=='B') now=fa[now];else{int k=s[i]-'a';if (ch[now][k]==0) ch[now][k]=++sz,fa[sz]=now;now=ch[now][k];}}
}
void bfs(){std::queue<int>Q;for (int i=0;i<26;i++)if (!ch[root][i]) ch[root][i]=root;else if (ch[root][i]){fail[ch[root][i]]=root;Q.push(ch[root][i]);}while (!Q.empty()){int now=Q.front();Q.pop();for (int i=0;i<26;i++)if (!ch[now][i]){ch[now][i]=ch[fail[now]][i];}else{fail[ch[now][i]]=ch[fail[now]][i];Q.push(ch[now][i]);}}
}
void dfs(int x){dfn[x]=++hw;for (int i=first[x];i;i=next[i]){int pur=go[i];dfs(pur);}low[x]=++hw;
}
void solve(){add(dfn[1],1);//root节点也算上 int sx=0,now=1;for (int i=0;i<n;i++){if (s[i]=='P'){sx++;for (int j=fi[sx];j;j=que[j].next){int pur=pos[que[j].to];ans[que[j].id]+=query(low[pur])-query(dfn[pur]-1);}//询问dfs序区间里面有多少标记过的节点,有多少就代表y到root路径上的节点有多少能走到x的尾节点 }elseif (s[i]=='B') add(dfn[now],-1),now=fa[now];//删除的时候去掉 else{now=ch[now][s[i]-'a'];add(dfn[now],1);//走一步加一步
        }}
}
int main(){scanf("%s",s);root=1;n=strlen(s);build();bfs();//建AC自动机 for (int i=1;i<=sz;i++)insert(fail[i],i);//建fail树 dfs(0);//找dfs序 scanf("%d",&m);for (int i=1;i<=m;i++){//把y相同的询问弄到一起 int x,y;scanf("%d%d",&x,&y);num++;que[num].to=x;que[num].next=fi[y];que[num].id=i;fi[y]=num;}solve();//统计答案 for (int i=1;i<=m;i++)printf("%d\n",ans[i]);
}

转载于:https://www.cnblogs.com/qzqzgfy/p/5689086.html

BZOJ 2434 阿狸的打字机相关推荐

  1. BZOJ 2434: [Noi2011]阿狸的打字机 ACAM+fail树

    title BZOJ 2434 LUOGU 2414 Description 打字机上只有 \(28\) 个按键,分别印有 \(26\) 个小写英文字母和 B.P 两个字母,是这样工作的: 输入小写字 ...

  2. [bzoj 2434][Noi2011]阿狸的打字机

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2434 [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory ...

  3. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

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

  4. 【bzoj 2434】【codevs 1946】[Noi2011]阿狸的打字机(AC自动机)

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

  5. bzoj 2434 [Noi2011]阿狸的打字机(AC自动机+fail树+dfs序+树状数组)

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

  6. 2434: [Noi2011]阿狸的打字机

    2434: [Noi2011]阿狸的打字机 https://lydsy.com/JudgeOnline/problem.php?id=2434 分析: AC自动机. 查询x在y中出现了几次,就是查询y ...

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

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

  8. P2414 NOI2011阿狸的打字机 [AC自动机,dfs序]

    阿狸的打字机 题解 题目中给出的字符串就是构建TrieTrieTrie树的顺序.我们将字符串依次读入,每读入一个小写字符就相当于在TrieTrieTrie树当前节点下插入一个小写字符,读入BBB时,就 ...

  9. BZOJ 2563 : 阿狸和桃子的游戏

    BZOJ 2563 : 阿狸和桃子的游戏 (机巧的贪心) 题目传送门 [问题描述] 大概就是,给你一个N个点的图(保证N是偶数).点和边都有权值. 有两个绝顶聪明的人,一人轮流选一次点(每个点仅可被选 ...

最新文章

  1. [Java基础]字节缓冲流
  2. 《PHP对象、模式与实践》之对象
  3. Huawei eNSP 安装教程
  4. Linux内核之capabilities能力
  5. 工作项跟踪管理系统数据库结构图
  6. 计算机网络基础系列(二)计算机网络体系结构
  7. 步态识别之GaitSet
  8. Rayman的绝顶之路——Leetcode每日一题打卡10
  9. 11.3 帧中继基本配置
  10. ProjectProfessional2003密钥
  11. R按比例大小画2个以上的数据的Venn图
  12. 移动硬盘更改驱动器号和路径_如何在Windows 10中更改默认硬盘驱动器以保存文档和应用程序...
  13. Dubbo源码解析-——服务引用
  14. 卷积神经网络 svm分类器_使用卷积神经网络的狗品种分类器
  15. mysql 退出数据库_mysql怎样退出使用数据库
  16. 夜莺:2019年运营微信个人号的3个营销价值
  17. Databus--低延迟的分布式数据库同步系统(Canal类似)
  18. 《信号与系统》(吴京)部分课后习题答案与解析——第三章(连续LTI系统的时域分析)
  19. channelarlist_易优CMS:channelartlist 获取当前频道的下级栏目的内容列表
  20. 神经网络的图像识别技术,语音识别深度神经网络

热门文章

  1. 转 AIX7.2+11.2.0.4RAC实施
  2. Java™ 教程(字符流)
  3. 接口性能测试实战小结
  4. zabbix_agent自动部署安装
  5. 玩转虚拟化VMWare之一: VMWare ESXi 5.0和vSphere Client安装和配置
  6. shell--局部变量
  7. ISA2006 之 域环境下部署
  8. deepin下载软件慢切换镜像
  9. 1.1.12 增加页眉横线
  10. windows开了远程控制访问老提示密码账号不正确