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

阿狸的打字机

题解

题目中给出的字符串就是构建TrieTrieTrie树的顺序.我们将字符串依次读入,每读入一个小写字符就相当于在TrieTrieTrie树当前节点下插入一个小写字符,读入BBB时,就在TrieTrieTrie树中向父节点移动一步.读入PPP的时候,就做一个标记.

然后对这颗TrieTrieTrie树构建ACACAC自动机.

找找规律发现第xxx串在第yyy串中出现的次数就是TrieTrieTrie树上xxx串尾点到yyy串末尾点的树链上,所有能直接或间接通过failfailfail指针跳到xxx串末尾点的点的个数.

观察到自动机上failfailfail指针构成了一颗failfailfail树.

进一步我们发现,所有能直接或间接跳到xxx串末尾点的点就是failfailfail树上,xxx节点的子树大小.

而实际的答案就是failfailfail树上xxx串末尾点的子树与TrieTrieTrie树上xxxyyy的树链的交集中点的个数.

我们对failfailfail树做一遍dfsdfsdfs序,用这个dfsdfsdfs序就可以查询和维护failfailfail树的子树的信息了.

对这个dfsdfsdfs序列建立一个树状数组.

然后我们对TrieTrieTrie树做一遍dfsdfsdfs,在dfsdfsdfs的过程中,把当前点在树状数组中的dfndfndfn位置+1+1+1,返回的时候在该位置−1-11,这样相当于在TrieTrieTrie树中从当前点到根节点的树链上所有节点都已经在树状数组中激活了,对于当前点作为yyy的询问,在failfailfail树的以xxx为根的子树中计算有多少个点被激活就ok了(树状数组查询前缀和).

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#define pr(x) std::cout << #x << ':' << x << std::endl
#define rep(i,a,b) for(int i = a;i <= b;++i)
#define LETTER 26
typedef std::pair<int,int> pii;
const int N = 100010;
char s[N];
struct Trie{int num,fail,fa;int next[LETTER];
}pool[N];
Trie* const trie = pool + 1;
int cnt;
void init() {cnt = 0;memset(pool,0,2*sizeof(Trie));trie[0].fail = -1;
}
int now;
int pat[N];
int pc;
std::vector<int> trie_edge[N];
void build() {pc = now = 0;for(int i = 0;s[i];++i) {if(s[i] == 'B') now = trie[now].fa;else if(s[i] == 'P') pat[++pc] = now;else {int &pos = trie[now].next[s[i]-'a'];if(!pos) {pos = ++cnt;memset(&trie[pos],0,sizeof(Trie));trie[pos].fa = now;trie_edge[now].push_back(pos);}now = pos;}}std::queue<int> Q;Q.push(0);while(!Q.empty()) {int t = Q.front();Q.pop();for(int i = 0;i < LETTER;++i) {int &cur = trie[t].next[i];if(cur) {Q.push(cur);trie[cur].fail = trie[trie[t].fail].next[i];}else cur = trie[trie[t].fail].next[i];}}
}
int bitree[N<<1];
int lowbit(int x) {return x & (-x);}
int sum(int pos) {int res = 0;for(;pos;pos -= lowbit(pos)) res += bitree[pos];return res;
}
void add(int pos,int x) {for(;pos < N<<1;pos += lowbit(pos))bitree[pos] += x;
}std::vector<int> edge[N];
int beg[N],end[N];
int idx = 0;
void dfs1(int u){beg[u] = ++idx;for(int v : edge[u]) dfs1(v);end[u] = ++idx;
}
std::vector<pii> query[N];
int ans[N];
void dfs2(int u) {add(beg[u],1);for(pii p : query[u]) {int x = p.first,id = p.second;ans[id] = sum(end[x])-sum(beg[x]-1);}for(int v : trie_edge[u])dfs2(v);add(beg[u],-1);
}int main() {init();std::ios::sync_with_stdio(false);std::cin >> s;build();for(int i = 1;i <= cnt;++i) edge[trie[i].fail].push_back(i);dfs1(0);int m;std::cin >> m;for(int i = 1;i <= m;++i) {int x,y;std::cin >> x >> y;query[pat[y]].push_back((pii){pat[x],i});}dfs2(0);for(int i = 1;i <= m;++i) {std::cout << ans[i] << std::endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ocelot.JwtAuthorize:一个基于网关的Jwt验证包

Ocelot作为基于.net core的API网关&#xff0c;有一个功能是统一验证&#xff0c;它的作用是把没有访问权限的请求挡在API网关外面&#xff0c;而不是到达API网关事端的API时才去验证&#xff1b;之前我有一篇博文Ocelot统一权限验证&#xff0c;作过说明&#xff0c;这篇博文说…

【并查集】小 X 的液体混合

小 X 的液体混合 题目大意&#xff1a; 在一个玻璃瓶里&#xff0c;放入一些液体&#xff0c;某一对液体放在一起会有反应&#xff0c;当某个液体有反应时危险度就会乘2&#xff08;初值为1&#xff09;&#xff0c;问危险度最大是多少 原题&#xff1a; 解题思路&#xff1…

P4151-[WC2011]最大XOR和路径【线性基】

正题 题目链接:https://www.luogu.com.cn/problem/P4151 题目大意 给一个无向图&#xff0c;求一条1∼n1\sim n1∼n的路径使得异或和最大。 解题思路 很强的思路啊&#xff08;好像去年YPXYPXYPX大爷就讲了反正我也没听懂&#xff09; 我们可以将路径拆分成三部分&#xff…

Swagger如何访问Ocelot中带权限验证的API

先亮源代码&#xff1a;https://github.com/axzxs2001/Asp.NetCoreExperiment/tree/master/Asp.NetCoreExperiment/SwaggerDemo这篇博文不是对asp.net core中使用Swagger作介绍&#xff0c;因为社区博客作了详细说明。今天主要说一下Swagger在Ocelot网关权限验证模式下的访问&a…

初一模拟赛总结(2019.4.13)

成绩&#xff1a; rank是有算其他dalaodalaodalao的 注&#xff1a; 这次好像是因为OJ有问题&#xff0c;导致一些AC代码变&#xff08;bei&#xff09;W&#xff08;zhi&#xff09;A&#xff08;cai&#xff09;了 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3…

etcd-workbench一款免费好用的ETCD客户端,支持SSHTunnel、版本对比等功能

介绍 今天推荐一款完全免费的ETCD客户端&#xff0c;可以私有化部署: etcd-workbench 开源地址&#xff1a;https://github.com/tzfun/etcd-workbench Gitee地址&#xff1a;https://gitee.com/tzfun/etcd-workbench 下载 本地运行 从 官方Release 下载最新版的 jar 包&am…

深度学习中反向传播算法简单推导笔记

反向传播算法简单推导笔记 1.全连接神经网络 该结构的前向传播可以写成: z(1)W(1)xb(1)z^{(1)} W^{(1)}xb^{(1)}z(1)W(1)xb(1) a(1)σ(z(1))a^{(1)} \sigma(z^{(1)})a(1)σ(z(1)) z(2)W(2)a(1)b(2)z^{(2)}W^{(2)}a^{(1)}b^{(2)}z(2)W(2)a(1)b(2) a(2)σ(z(2))a^{(2)} \sigm…

EntityFramework Core进行读写分离最佳实践方式,了解一下(二)?

写过上一篇关于EF Core中读写分离最佳实践方式后&#xff0c;虽然在一定程度上改善了问题&#xff0c;但是在评论中有的指出更换到从数据库。那么接下来要进行插入此时又要切换到主数据库&#xff0c;同时有的指出是否可以进行底层无感知操作&#xff0c;这确实是个问题&#x…

【图论】【Kosaraju】刻录光盘(ssl 2344)

刻录光盘 ssl 2344 题目大意&#xff1a; 求连通块 原题&#xff1a; 题目描述 在JSOI2005夏令营快要结束的时候&#xff0c;很多营员提出来要把整个夏令营期间的资料刻录成一张光盘给大家&#xff0c;以便大家回去后继续学习。组委会觉得这个主意不错&#xff01;可是组…

P4158-[SCOI2009]粉刷匠【dp,背包】

正题 https://www.luogu.com.cn/problem/P4158 题目大意 nnn个墙长度为mmm&#xff0c;每次可以粉刷一堵墙的连续一段区间&#xff0c;粉刷过的不能再粉刷。给出每个位置应该粉刷的颜色&#xff0c;然后求TTT次可以粉刷正确多少个位置。 解题思路 首先我们对于第iii堵墙处理出…

一文搞清到底什么是 .NET?

现在各种 .NET 满天飞&#xff0c;别说新手了&#xff0c;连我这样的老手都差点被绕进去。到底什么是 .NET 呢&#xff1f;通俗易懂&#xff0c;什么是.NET?什么是.NET Framework&#xff1f;什么是.NET Core? 这篇文章好长呀&#xff0c;不知道你看完了没有&#xff0c;其实…

P4552-[Poetize6]IncDec Sequence【差分】

正题 题目链接:https://www.luogu.com.cn/problem/P4552 题目大意 给出nnn个数&#xff0c;每次可以选择一个区间加一或减一&#xff0c;求最少操作使得所有数相等&#xff0c;并且求可能的最终序列个数。 解题思路 在差分数组上操作&#xff0c;那么操作变为将差分数组上一…

练习利用LSTM实现手写数字分类任务

练习利用LSTM实现手写数字分类任务 MNIST数据集中图片大小为28*28. 按照行进行展开成28维的特征向量。 考虑到这28个的向量之间存在着顺序依赖关系&#xff0c;我们可以将他们看成是一个长为28的输入序列&#xff0c;将其输入到LSTM中&#xff0c;LSTM可以从中提取到序列特征…

【图论】最短路上的统计(ssl 1500)

最短路上的统计 ssl 1500 题目大意&#xff1a; 求一个图中&#xff0c;从a到b的所有最短路所经过的点数之和 原题&#xff1a; 题目描述 一个无向图上&#xff0c;没有自环&#xff0c;所有边的权值均为1&#xff0c;对于一个点对&#xff08;a,b&#xff09;,我们要把所…

Service Mesh新成员:Consul 1.2

本文译自 HashiCorp 官网关于 Consul 1.2 支持 Service Mesh 发布的博客文章。原文链接&#xff1a;https://www.hashicorp.com/blog/consul-1-2-service-mesh作者&#xff1a;Mitchell Hashimoto 翻译&#xff1a;董干 转载自&#xff1a;https://blog.idevfun.io/consul-1-2-…

P4564-[CTSC2018]假面【期望dp】

正题 题目大意:https://www.luogu.com.cn/problem/P4564 题目大意 nnn个人第iii个有mim_imi​点血&#xff0c;每次有操作 有ppp的概率对一个人造成111点伤害&#xff08;如果死了就不算&#xff0c;ppp每次都不同&#xff09;给出若干个人&#xff0c;对里面存活的人随机选择…

VAE(变分自编码器)学习笔记

VAE学习笔记 普通的编码器可以将图像这类信息编码成为特征向量. 但通常这些特征向量不具有空间上的连续性. VAE(变分自编码器)可以将图像信息编码成为具有空间连续性的特征向量. 方法是向编码器和解码器中加入统计信息,即特征向量代表的的是一个高斯分布,强迫特征向量服从高…

小 X 的 AK 计划

小 X 的 AK 计划 题目大意&#xff1a; 有n个点&#xff0c;到一个点&#xff08;时间为距离&#xff09;并花一些时间可以A掉此点&#xff0c;问最多可以A多少个点 原题&#xff1a; 解题思路&#xff1a; 先按位置从小到大排序&#xff0c;然后到每一个点并A掉的时间加在…

.NET Core 2.1的重大缺陷延长了.NET Core 2.0的寿命

微软近日宣布&#xff0c;.NET Core 2.0 即将 "寿终正寝"&#xff0c;对它的支持将在2018年10月1日结束。.NET Core 2.0 是一个非长期支持&#xff08;LTS&#xff09;的版本&#xff0c;因此微软的承诺是在下一个版本发布的三个月之后结束对它的支持。由于 .NET Cor…

P4782-[模板]2-SAT问题【tarjan】

正题 题目链接:https://www.luogu.com.cn/problem/P4782 题目大意 给若干个条件限定为xi为a或xj为bx_i为a或x_j为bxi​为a或xj​为b。求构造一个序列xxx满足所有条件 解题思路 我们对于每个xix_ixi​构造两个点分别表示xix_ixi​为0/10/10/1。然后就开始对能够确定的条件关系…