https://www.luogu.org/problemnew/show/P2414

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

题解:AC自动机

C++版本一

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAX 200000
inline int read()
{int x=0,t=1;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=-1,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return x*t;
}
char ss[MAX];
int nd[MAX],n,tot;
int ans[MAX];
int c[MAX];
int dfn[MAX],low[MAX],tim;
int ql[MAX],qr[MAX];
inline int lowbit(int x){return x&(-x);}
void Modify(int x,int w){while(x<=tim)c[x]+=w,x+=lowbit(x);}
int getsum(int x){int ret=0;while(x)ret+=c[x],x-=lowbit(x);return ret;}
struct Node
{int vis[26];int Vis[26];int fail,fa;int lt;
}t[MAX];
struct Question{int x,y,id,ans;}q[MAX];
bool operator<(Question a,Question b){return a.y<b.y;}
void GetFail()
{queue<int> Q;for(int i=0;i<26;++i)if(t[0].vis[i])Q.push(t[0].vis[i]);while(!Q.empty()){int u=Q.front();Q.pop();for(int i=0;i<26;++i)if(t[u].vis[i])t[t[u].vis[i]].fail=t[t[u].fail].vis[i],Q.push(t[u].vis[i]);else t[u].vis[i]=t[t[u].fail].vis[i];}
}
struct Line{int v,next;}e[MAX<<1];
int h[MAX],cnt=1;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
void dfs(int u)
{dfn[u]=++tim;for(int i=h[u];i;i=e[i].next)dfs(e[i].v);low[u]=tim;
}
void DFS(int u)
{Modify(dfn[u],1);if(t[u].lt)for(int i=ql[t[u].lt];i<=qr[t[u].lt];++i)q[i].ans=getsum(low[nd[q[i].x]])-getsum(dfn[nd[q[i].x]]-1);for(int i=0;i<26;++i)if(t[u].Vis[i])DFS(t[u].Vis[i]);Modify(dfn[u],-1);
}
int main()
{scanf("%s",ss+1);int now=0;for(int i=1,l=strlen(ss+1);i<=l;++i){if(ss[i]>='a'&&ss[i]<='z'){if(!t[now].vis[ss[i]-'a'])t[now].vis[ss[i]-'a']=++tot,t[tot].fa=now;now=t[now].vis[ss[i]-'a'];}if(ss[i]=='B')now=t[now].fa;if(ss[i]=='P'){nd[++n]=now;t[now].lt=n;}}for(int i=0;i<=tot;++i)for(int j=0;j<26;++j)t[i].Vis[j]=t[i].vis[j];int Q=read();GetFail();for(int i=1;i<=tot;++i)Add(t[i].fail,i);dfs(0);for(int i=1;i<=Q;++i){q[i].x=read(),q[i].y=read();q[i].id=i;}sort(&q[1],&q[Q+1]);for(int i=1,pos=1;i<=Q;i=pos){ql[q[i].y]=i;while(q[pos].y==q[i].y)pos++;qr[q[i].y]=pos-1;}DFS(0);for(int i=1;i<=Q;++i)ans[q[i].id]=q[i].ans;for(int i=1;i<=Q;++i)printf("%d\n",ans[i]);return 0;
}

[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. 【bzoj2434】[Noi2011]阿狸的打字机 AC自动机+Dfs序+树状数组

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

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

    Description 打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的: ·输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母 ...

最新文章

  1. CVPR 2021 | 超越卷积,自注意力模型HaloNet准确率实现SOTA
  2. CSDN2008最有价值博客获奖感言--放飞梦想,让我们扬帆远航
  3. 什么是重载or重写,二者的区别是?
  4. 可以使用计算机解决的问题是什么,1.1 使用计算机解决问题的一般过程教案1
  5. 数字图像处理:图像的频域
  6. Oracle Segments可以跨多个data files吗?
  7. IE每打开一个网页跳出网页处理
  8. 问题 F: 成绩统计
  9. iOS安全系列之一:HTTPS
  10. 「leetcode」77.组合【回溯算法】详解!
  11. R_ggplot2基础(四)
  12. linux oracle 强制覆盖_赤兔Oracle数据库恢复软件下载-赤兔Oracle数据库恢复软件v11.6免费版...
  13. 配置Windows 10远程桌面
  14. 1.2 基本RS触发器原理
  15. 海洋技术课设遥感反演matlab,国家重点研发计划项目“新型海洋微波遥感探测机理模型与应用研究” 课题一“微波极化遥感机理与应用技术”学术研讨会顺利召开...
  16. Altium designer快速查找PCB中的元器件
  17. 8086、80286、80386
  18. 【Python】Pandas DataFrame 一维表二维表的转换
  19. CIE1931色度坐标及黑体轨迹
  20. 将OpenCV抓拍的图片进行x264编码并保存到文件

热门文章

  1. eeprom的wp 引脚_EEPROM
  2. matlab求实根,用弦截法任意实数方程求实根 用matlab 语言编程
  3. android自定义模态框,安卓开发自定义弹出框的简单方式(纯代码布局)
  4. java jdk工具
  5. linux核能软件,ARM big.LITTLE大小核架构在Linux和Android内核下多核调度算法
  6. python 类的知识点整理_Python opp知识整理
  7. /和//在python中使用
  8. 【Python金融量化 5- 100 】、五、蒙特卡洛和毛利
  9. Python工程师学习笔记
  10. 北京内推 | 微软亚洲互联网工程院(STCA)招聘NLP算法实习生