BZOJ 2434 阿狸的打字机
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 阿狸的打字机相关推荐
- BZOJ 2434: [Noi2011]阿狸的打字机 ACAM+fail树
title BZOJ 2434 LUOGU 2414 Description 打字机上只有 \(28\) 个按键,分别印有 \(26\) 个小写英文字母和 B.P 两个字母,是这样工作的: 输入小写字 ...
- [bzoj 2434][Noi2011]阿狸的打字机
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2434 [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 2545 Solved: 1419 [Submit][S ...
- 【bzoj 2434】【codevs 1946】[Noi2011]阿狸的打字机(AC自动机)
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 2477 Solved: 1382 [Submit][S ...
- bzoj 2434 [Noi2011]阿狸的打字机(AC自动机+fail树+dfs序+树状数组)
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 3521 Solved: 1913 [Submit][S ...
- 2434: [Noi2011]阿狸的打字机
2434: [Noi2011]阿狸的打字机 https://lydsy.com/JudgeOnline/problem.php?id=2434 分析: AC自动机. 查询x在y中出现了几次,就是查询y ...
- 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组
[BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...
- P2414 NOI2011阿狸的打字机 [AC自动机,dfs序]
阿狸的打字机 题解 题目中给出的字符串就是构建TrieTrieTrie树的顺序.我们将字符串依次读入,每读入一个小写字符就相当于在TrieTrieTrie树当前节点下插入一个小写字符,读入BBB时,就 ...
- BZOJ 2563 : 阿狸和桃子的游戏
BZOJ 2563 : 阿狸和桃子的游戏 (机巧的贪心) 题目传送门 [问题描述] 大概就是,给你一个N个点的图(保证N是偶数).点和边都有权值. 有两个绝顶聪明的人,一人轮流选一次点(每个点仅可被选 ...
最新文章
- [Java基础]字节缓冲流
- 《PHP对象、模式与实践》之对象
- Huawei eNSP 安装教程
- Linux内核之capabilities能力
- 工作项跟踪管理系统数据库结构图
- 计算机网络基础系列(二)计算机网络体系结构
- 步态识别之GaitSet
- Rayman的绝顶之路——Leetcode每日一题打卡10
- 11.3 帧中继基本配置
- ProjectProfessional2003密钥
- R按比例大小画2个以上的数据的Venn图
- 移动硬盘更改驱动器号和路径_如何在Windows 10中更改默认硬盘驱动器以保存文档和应用程序...
- Dubbo源码解析-——服务引用
- 卷积神经网络 svm分类器_使用卷积神经网络的狗品种分类器
- mysql 退出数据库_mysql怎样退出使用数据库
- 夜莺:2019年运营微信个人号的3个营销价值
- Databus--低延迟的分布式数据库同步系统(Canal类似)
- 《信号与系统》(吴京)部分课后习题答案与解析——第三章(连续LTI系统的时域分析)
- channelarlist_易优CMS:channelartlist 获取当前频道的下级栏目的内容列表
- 神经网络的图像识别技术,语音识别深度神经网络