【AC自动机】Lougu P3796】的更多相关文章

题目描述 有NNN个由小写字母组成的模式串以及一个文本串TTT.每个模式串可能会在文本串中出现多次.你需要找出哪些模式串在文本串TTT中出现的次数最多. 输入输出格式 输入格式: 输入含多组数据. 每组数据的第一行为一个正整数NNN,表示共有NNN个模式串,1≤N≤1501 \leq N \leq 1501≤N≤150. 接下去NNN行,每行一个长度小于等于707070的模式串.下一行是一个长度小于等于10610^6106的文本串TTT. 输入结束标志为N=0N=0N=0. 输出格式: 对于每组…
P3796 [模板]AC自动机(加强版) https://www.luogu.org/problemnew/show/P3796 题目描述 有NN个由小写字母组成的模式串以及一个文本串TT.每个模式串可能会在文本串中出现多次.你需要找出哪些模式串在文本串TT中出现的次数最多. 输入输出格式 输入格式: 输入含多组数据. 每组数据的第一行为一个正整数NN,表示共有NN个模式串,1 \leq N \leq 1501≤N≤150. 接下去NN行,每行一个长度小于等于7070的模式串.下一行是一个长度小…
[题解]P3796 [模板]AC自动机(加强版) 记录当前\(cnt\)是第几个"星".记录第几个串是对应着第几个星. 这里补充一点对于\(AC\)自动机的理解.可能一直有个问题我没有想明白,就是打标记的点只有一个,然而匹配时,假若一个分支包括了另一个不同的分支该怎么办.实际上,我们可以在匹配的时候使用\(fail\)数组进行类似链式前向星的遍历,从而遍历到那个打标记的地方.那么问题来了,怎么保证链式前向星会遍历到那个打了标记的节点呢?答案就在\(gen\_fail\)的玄机里.\(g…
题目:P3808:https://www.luogu.org/problemnew/show/P3808 P3796:https://www.luogu.org/problemnew/show/P3796 从这里学了下AC自动机:http://www.cnblogs.com/cjyyb/p/7196308.html 我的理解大概就是构建一棵由模式串组成的 Trie 树,然后把文本串一节一节放在上面查找: 失配指针指向的是结尾字母和自己一样的.Trie 树上的其他分支,大约就是在找后缀这样的感觉:…
题目链接:https://www.luogu.com.cn/problem/P3796 AC自动机:复杂度$O( (N+M)\times L )$,N为模式串个数,L为平均长度,M为文章长度. insert: 构造一个trie,然后标记一下每一个模式串的最后一个,即$vis$. get_fail: 进行在trie上进行BFS,第一层点的失配指针指向根节点:之后的一个节点失配指针指向/他父亲的失配指针/指向的节点中/的儿子具有相同节点的位置. 这里有一个小优化:fail是用来寻找失配时走到的位置的…
原题链接 Description 模板题啦~ Code //[模板]AC自动机(加强版) #include <cstdio> #include <cstring> int const N=2e5; int const L=1e6+10; int n; char s1[200][80],s2[L]; int rt,ndCnt; int ch[N][26],val[N],fail[N],pre[N]; void ins(char s[],int id) { int len=strlen…
洛谷题目传送门 先膜一发yyb巨佬 orz 想学ac自动机的话,推荐一下yyb巨佬的博客,本蒟蒻也是从那里开始学的. 思路分析 裸的AC自动机,这里就不讲了.主要是这题太卡时了,尽管时限放的很大了...... 用传统方法匹配时,每走到一个新位置,都是要统计答案的.怎么统计呢?暴力跳\(fail\),把沿路上能够产生答案的算上,直到跳到根才停下来.这里的时间复杂度是 \(O(70N)\),在有多组数据的情况下其实是很吃亏的.(蒟蒻用了\(fread\),根据目测,最大的一个点输入大小在\(30MB…
嘟嘟嘟 这个和某谷的AC自动机模板简单版差不多. 但还是要注意几点的: 1.这个是统计出现次数,而不是是否出现,所以在查询的时候加上这个节点的val后,不能把val标记为-1.那么也就可以说查询的时间复杂度能比简单版的稍微第一慢一点. 2.考虑k个一样的模式串:刚开始我想的是每一个节点开一个vector,记录这里是第几个模式串.但其实没有这个必要,对于相同的模式串,我们只用记录任意一个就行,反而在出现次数上要都加上.因为如果主串中存在这些相同的模式串,那么出现次数应该是出现次数 * k.输出的时…
传送门 AC自动机的模板 简单的理解就是字典树上的KMP 注意数组不要开太大 不然每次memset耗时太多 有一个小优化 每次走 fail 边找匹配时只有一些会更新答案 那么就可以把没用的fail边压缩掉 设 g[x] 表示从 x 点一直走 fail 边,走到的第一个有结束标记的点 那么找匹配时就只有要 g 边 然后就是模板了 #include<iostream> #include<cstring> #include<cstdio> #include<cmath&…
浙江集训Day9,没有出任何实质性成果,只好把昨天打完的板子记一下. 该博客基于luogu的三道模版题.只有一个大致的讲解,主要提供代码给自己参考. ----------------------------------------------------------------------- (7.14) 一.AC自动机 AC自动机,一个有着令人容易误会的名字的有限状态自动机结构,主要被应用在多模式串的文本匹配问题中.理解AC自动机,首先要熟悉KMP算法和字典树.使用KMP可以分开对每个模式串进…