「luogu2414」[NOI2011]阿狸的打字机
建出AC自动机,获得fail树,发现问题转化成求以x为根的子树中有多少个属于y串的节点。
求出fail树的dfs序,由dfs序的性质可知以x为根的子树在dfs序上是连续的。
在trie树中跑一边dfs,dfs过程中用树状数组统计答案即可。
注意fail树的节点数是tot+1。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=100010; 4 char ss[N]; 5 int n,m,tot,spos[N]; //spos[i]:串i在trie树中的位置 6 int pre[N],ch[N][26],fail[N]; 7 int qx[N],qy[N],ans[N],bit[N]; 8 vector<int>g[N],curq[N]; 9 inline void build_trie(char* s){ 10 int l=strlen(s),now=0; 11 for(int i=0;i<l;i++){ 12 if(s[i]=='B') now=pre[now]; 13 else if(s[i]=='P') spos[++n]=now; 14 else{ 15 int c=s[i]-'a'; 16 if(!ch[now][c]) ch[now][c]=++tot,pre[tot]=now; 17 now=ch[now][c]; 18 } 19 } 20 return; 21 } 22 inline void build_fail(){ 23 queue<int>q; 24 for(int i=0;i<26;i++)if(ch[0][i]){ 25 q.push(ch[0][i]); 26 g[0].push_back(ch[0][i]); 27 } 28 int x; 29 while(!q.empty()){ 30 x=q.front();q.pop(); 31 for(int i=0;i<26;i++)if(ch[x][i]){ 32 q.push(ch[x][i]); 33 int j=fail[x]; 34 while(j&&!ch[j][i]) j=fail[j]; 35 fail[ch[x][i]]=ch[j][i]; 36 g[ch[j][i]].push_back(ch[x][i]); 37 } 38 } 39 return; 40 } 41 int fa[N],id[N],siz[N],dfn; 42 void dfs(int k,int father){ 43 id[k]=++dfn,fa[k]=father,siz[k]=1; 44 for(int i=0;i<g[k].size();i++){ 45 int x=g[k][i]; 46 if(x==father) continue; 47 dfs(x,k); 48 siz[k]+=siz[x]; 49 } 50 return; 51 } 52 inline int lowbit(int k){return k&(-k);} 53 inline void bitadd(int pos,int x){ 54 while(pos<=tot+1) bit[pos]+=x,pos+=lowbit(pos); 55 return; 56 } 57 inline int bitque(int pos){ 58 int ans=0; 59 while(pos) ans+=bit[pos],pos-=lowbit(pos); 60 return ans; 61 } 62 void dfs_trie(int k){ 63 bitadd(id[k],1); 64 for(int i=0;i<curq[k].size();i++){ 65 int x=curq[k][i]; 66 ans[x]=bitque(id[spos[qx[x]]]+siz[spos[qx[x]]]-1)-bitque(id[spos[qx[x]]]-1); 67 } 68 for(int i=0;i<26;i++)if(ch[k][i]){ 69 dfs_trie(ch[k][i]); 70 } 71 bitadd(id[k],-1); 72 return; 73 } 74 int main(){ 75 scanf("%s",ss); 76 build_trie(ss); 77 build_fail(); 78 dfs(0,-1); 79 scanf("%d",&m); 80 for(int i=1;i<=m;i++){ 81 scanf("%d%d",&qx[i],&qy[i]); 82 curq[spos[qy[i]]].push_back(i); 83 } 84 dfs_trie(0); 85 for(int i=1;i<=m;i++) printf("%d\n",ans[i]); 86 return 0; 87 }
转载于:https://www.cnblogs.com/mycups/p/8565572.html
「luogu2414」[NOI2011]阿狸的打字机相关推荐
- 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组
[BZOJ2434][NOI2011]阿狸的打字机 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 ...
- 2434: [Noi2011]阿狸的打字机
2434: [Noi2011]阿狸的打字机 https://lydsy.com/JudgeOnline/problem.php?id=2434 分析: AC自动机. 查询x在y中出现了几次,就是查询y ...
- 【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 ...
- [NOI2011] 阿狸的打字机
[NOI2011] 阿狸的打字机 题目描述 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有 28 28 28 个按键,分别印有 26 26 26 个小写英文字母和 B.P 两 ...
- P2414 NOI2011阿狸的打字机 [AC自动机,dfs序]
阿狸的打字机 题解 题目中给出的字符串就是构建TrieTrieTrie树的顺序.我们将字符串依次读入,每读入一个小写字符就相当于在TrieTrieTrie树当前节点下插入一个小写字符,读入BBB时,就 ...
- [luogu2414 NOI2011]阿狸的打字机 (AC自动机)
传送门 Solution 我们知道AC自动机上如果有一点A的fail[A]->B那么B为A的一个后缀 那么我们的问题\((x,y)\)就变为在y中有多少个点直接或间接连向x的终止节点 如果写暴力 ...
最新文章
- Nancy之结合TinyFox调试备忘
- Python- 反射 及部份内置属性方法
- 安装composer出现链接补上的问题
- 设计模式-装饰模式(Decorator Pattern)
- 基于.NET下的人工智能系列专题|.NET下的人工智能系列专题|用Keras.NET 做一个图像识别的训练...
- Java6 WebService学习
- 怎么用计算机弹柯南,柯迷们的骚操作有哪些?用计算器弹柯南主题曲,自制缩小药丸...
- java自动下载更新程序_android实现软件自动更新的步骤
- 蓝桥杯 ADV-103 算法提高 逆序排列
- javascript调用alert()
- GC root 解决了循环引用的垃圾回收问题
- McBSP初始化以及和EDMA的结合使用(C64X DSP)
- 页面置换模拟程序c语言,LRU页面置换算法模拟
- MP3音频文件转换成caf格式
- Apache commons digester简介说明
- CCNA系列十一之Frame-Relay
- 朴素贝叶斯-凉鞋问题
- php变量名动态生成,PHP中动态创建变量名(可变变量) | 学步园
- 5款移动开发轻量jQuery的替代品
- Oracle数据库启动与关闭
热门文章
- 潜谈IT从业人员在传统IT和互联网之间的择业问题(上)-传统乙方形公司
- 搭建 OpenStack 实验环境 - 每天5分钟玩转 OpenStack(16)
- Android checkCallingPermission()方法返回值问题
- 禁止迅雷:迅雷服务器地址大全+ISA计算机集(xml)
- PAT1018. 锤子剪刀布
- 龙格库塔法和欧拉法求解微分方程的比较
- 动态RAM的集中刷新、分散刷新、异步刷新
- 阿里云安装宝塔打不开 已经开放安全组_centOS7 apache安装PHPMYADMIN
- ChaiNext:市场情绪对行情影响开始减弱
- PancakeBunny获160万美元战略融资,Binance Labs领投