建出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]阿狸的打字机相关推荐

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

    [BZOJ2434][NOI2011]阿狸的打字机 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. 2434: [Noi2011]阿狸的打字机

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

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

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

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

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

  7. [NOI2011] 阿狸的打字机

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

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

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

  9. [luogu2414 NOI2011]阿狸的打字机 (AC自动机)

    传送门 Solution 我们知道AC自动机上如果有一点A的fail[A]->B那么B为A的一个后缀 那么我们的问题\((x,y)\)就变为在y中有多少个点直接或间接连向x的终止节点 如果写暴力 ...

最新文章

  1. Nancy之结合TinyFox调试备忘
  2. Python- 反射 及部份内置属性方法
  3. 安装composer出现链接补上的问题
  4. 设计模式-装饰模式(Decorator Pattern)
  5. 基于.NET下的人工智能系列专题|.NET下的人工智能系列专题|用Keras.NET 做一个图像识别的训练...
  6. Java6 WebService学习
  7. 怎么用计算机弹柯南,柯迷们的骚操作有哪些?用计算器弹柯南主题曲,自制缩小药丸...
  8. java自动下载更新程序_android实现软件自动更新的步骤
  9. 蓝桥杯 ADV-103 算法提高 逆序排列
  10. javascript调用alert()
  11. GC root 解决了循环引用的垃圾回收问题
  12. McBSP初始化以及和EDMA的结合使用(C64X DSP)
  13. 页面置换模拟程序c语言,LRU页面置换算法模拟
  14. MP3音频文件转换成caf格式
  15. Apache commons digester简介说明
  16. CCNA系列十一之Frame-Relay
  17. 朴素贝叶斯-凉鞋问题
  18. php变量名动态生成,PHP中动态创建变量名(可变变量) | 学步园
  19. 5款移动开发轻量jQuery的替代品
  20. Oracle数据库启动与关闭

热门文章

  1. 潜谈IT从业人员在传统IT和互联网之间的择业问题(上)-传统乙方形公司
  2. 搭建 OpenStack 实验环境 - 每天5分钟玩转 OpenStack(16)
  3. Android checkCallingPermission()方法返回值问题
  4. 禁止迅雷:迅雷服务器地址大全+ISA计算机集(xml)
  5. PAT1018. 锤子剪刀布
  6. 龙格库塔法和欧拉法求解微分方程的比较
  7. 动态RAM的集中刷新、分散刷新、异步刷新
  8. 阿里云安装宝塔打不开 已经开放安全组_centOS7 apache安装PHPMYADMIN
  9. ChaiNext:市场情绪对行情影响开始减弱
  10. PancakeBunny获160万美元战略融资,Binance Labs领投