#AC自动机,树状数组#洛谷 2414 [NOI2011] 阿狸的打字机
分析
首先考虑按照题意建出一个AC自动机,
然后\(s[x]\)在\(s[y]\)出现的次数也就是
在fail树上,根节点到\(y\)中一共出现了多少个\(x\),
在\(x\)的终止节点处统计子树中根节点到\(y\)有多少个
代码
#include <cstdio>
#include <cctype>
#include <cstring>
#include <queue>
#include <vector>
#define rr register
using namespace std;
const int N=100011; vector<int>KU[N];
struct node{int y,next;}e[N];
int endd[N],sit[N],k,X[N],dfn[N],Trie[N][26];
int tot,c[N],n,m,rfn[N],as[N],ans[N];
struct I_AC_THE_TASK{
int Tot,trie[N][26],fail[N],FA[N],now;
inline void Append(char c){
if (!trie[now][c-97]) trie[now][c-97]=++Tot,FA[Tot]=now;
now=trie[now][c-97];
}
inline void Build(){
rr queue<int>q; q.push(1);
while (!q.empty()){
rr int x=q.front(); q.pop();
for (rr int i=0;i<26;++i)
if (!trie[x][i]) trie[x][i]=trie[fail[x]][i];
else fail[trie[x][i]]=trie[fail[x]][i],q.push(trie[x][i]);
}
}
}AC;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline void update(int x,int y){for (;x<=tot;x+=-x&x) c[x]+=y;}
inline signed query(int l,int r){
rr int ans=0; --l;
for (;r>l;r-=-r&r) ans+=c[r];
for (;l>r;l-=-l&l) ans-=c[l];
return ans;
}
inline void add(int x,int y){e[++k]=(node){y,as[x]},as[x]=k;}
inline void dfs1(int x){
dfn[x]=++tot;
for (rr int i=as[x];i;i=e[i].next)
dfs1(e[i].y);
rfn[x]=tot;
}
inline void dfs2(int x){
update(dfn[x],1);
if (endd[x]){
rr int ed=endd[x];
for (rr int i=0;i<KU[ed].size();++i){
rr int RK=KU[ed][i],p=sit[X[RK]];
ans[RK]=query(dfn[p],rfn[p]);
}
}
for (rr int i=0;i<26;++i)
if (Trie[x][i]) dfs2(Trie[x][i]);
update(dfn[x],-1);
}
signed main(){
AC.Tot=AC.now=AC.FA[1]=1; rr char c=getchar();
for (rr int i=0;i<26;++i) AC.trie[0][i]=1;
while (!islower(c)) c=getchar();
while (isalpha(c)){
if (c=='B') AC.now=AC.FA[AC.now];
else if (c=='P') endd[AC.now]=++n,sit[n]=AC.now;
else AC.Append(c);
c=getchar();
}
memcpy(Trie,AC.trie,sizeof(AC.trie));
AC.Build(),m=iut();
for (rr int i=1;i<=m;++i){
rr int x=iut(),y=iut();
KU[y].push_back(i),X[i]=x;
}
for (rr int i=2;i<=AC.Tot;++i) add(AC.fail[i],i);
dfs1(1),dfs2(1);
for (rr int i=1;i<=m;++i) print(ans[i]),putchar(10);
return 0;
}
#AC自动机,树状数组#洛谷 2414 [NOI2011] 阿狸的打字机的更多相关文章
- 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树
正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...
- 【BZOJ】2434: [Noi2011]阿狸的打字机 AC自动机+树状数组+DFS序
[题意]阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的: l 输入小写 ...
- 【AC自动机】【树状数组】【dfs序】洛谷 P2414 [NOI2011]阿狸的打字机 题解
这一题是对AC自动机的充分理解和树dfs序的巧妙运用. 题目背景 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机. 题目描述 打字机上只有28个按键,分别印有26个小写英文字母和' ...
- BZOJ2434: [Noi2011]阿狸的打字机(AC自动机 树状数组)
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4140 Solved: 2276[Submit][Status][Discuss] Descript ...
- BZOJ3881[Coci2015]Divljak——AC自动机+树状数组+LCA+dfs序+树链的并
题目描述 Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. ...
- HDU 6096 String(AC自动机+树状数组)
题意 给定 \(n\) 个单词,\(q\) 个询问,每个询问包含两个串 \(s_1,s_2\),询问有多少个单词以 \(s_1\) 为前缀, \(s_2\) 为后缀,前后缀不能重叠. \(1 \leq ...
- bzoj 2434 AC自动机+树状数组
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3493 Solved: 1909[Submit][Sta ...
- [NOI2011]阿狸的打字机 --- AC自动机 + 树状数组
[NOI2011] 阿狸的打字机 题目描述: 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机. 打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现, ...
- 【dfs序+AC自动机+树状数组】BZOJ2434-[Noi2011]阿狸的打字机
[题目大意] 输入一个字符串,其中:(1)a..z:在字符串末尾添加当前字符(2)P:输出当前字符串(3)B:从当前字符串末尾删去一个字符. 给出m组查询,输出第i个输出的字符串在第j个输出的字符串内 ...
- 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组
题目描述 回忆树是一棵树,树边上有小写字母. 一次回忆是这样的:你想起过往,触及心底--唔,不对,我们要说题目. 这题中我们认为回忆是这样的:给定 \(2\) 个点 \(u,v\) (\(u\) 可能 ...
随机推荐
- pikachu sql inject 宽字节注入
宽字节注入原理 什么是宽字节? 如果一个字符的大小是一个字节的,称为窄字节: 如果一个字符的大小是两个字节的,成为宽字节: 像GB2312.GBK.GB18030.BIG5.Shift_JIS等这些编 ...
- Docker进阶之01-Docker Compose编排工具
Docker Compose是什么 https://github.com/docker/compose 可以按项目为单位管理多个Docker容器,Python语言开发,底层调用Docker的API接口 ...
- django学习第六天---shell指令,单表基于双下划线的模糊查询,distinct注意点,字段的choices属性,url反向解析,orm多表操作创建表
shell指令 命令 python manage.py shell 在Terminal,执行上面这个指令会进入到python解释器环境中,并且加载了我们当前django项目配置环境,所以可以在当前sh ...
- goroutine并发
每一个并非的执行单元叫作一个goroutine.设想这里的一个程序有两个函数,一个函数做计算,另一个输出结果,假设两个函数没有相互之间的调用关系.一个线性的程序会先调用其中的一个函数,然后再调用另一个 ...
- 【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
问题描述 在Azure App Service for Windows的环境中,部署.NET应用,其中使用了 SAP NetWeaver RFC函数 (需要加载 sapnwrfc.dll).详细的错误 ...
- 【Azure 应用服务】在App Service 中如何通过Managed Identity获取访问Azure资源的Token呢? 如Key Vault
问题描述 当App Service启用了Managed Identity后,Azure中的资源就可以使用此Identity访问. 如果需要显示的获取这个Token,如何实现呢? 问题解答 在App S ...
- C# 多线程(17):小总结
前言 本篇内容是小总结和过渡,看完这篇后,就要开始继续学习 C# 多线程中的知识点啦~. 前面,经过 16 篇的学习,我们学习了多线程.锁.线程池.任务.同步.异步等知识,还没有使用到 async.a ...
- Java 练习题 看起来很简单 写起来却有点难度
1 import java.io.PrintStream; 2 3 /* 4 * 5 * public class ValueTransferTest4 6 *{ 7 * public static ...
- 为什么现在连Date类都不建议使用了?
一.有什么问题吗java.util.Date? java.util.Date(Date从现在开始)是一个糟糕的类型,这解释了为什么它的大部分内容在 Java 1.1 中被弃用(但不幸的是仍在使用). ...
- Linux性能监控(一)-sar
sar是一个非常全面的一个分析工具,对文件的读写,系统调用的使用情况,磁盘IO,CPU相关使用情况,内存使用情况,进程活动等都可以进行有效的分析.sar工具将对系统当前的状态进行取样,然后通过计算数据 ...