传送门 ac自动机模板,可能我写的ac自动机是有点问题的,所以跑的有些慢 暴力跳fail统计 代码: #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<queue> using namespace std; void read(int &x) { char ch; bool ok; for(ok=0,ch=getchar()…
题意:给你几个keywords,再给你一段文章,问你keywords出现了几次. 思路:这里就要用到多模匹配算法AC自动机了,AC自动机需要KMP和字典树的知识,匹配时是在字典树上,失配我们就要用到类似KMP的失配值了,如果失配,我们就沿着失配值到某个节点开始匹配,因为是多模匹配,我们每次失配移动都会从某一keyword的某部分开始匹配,这样就节省了很多时间. 话说第一次听到AC自动机我竟天真的以为是会自动AC题目的算法...orz 参考: AC自动机算法详解 (转载) ac自动机最详细的讲解,…
传送门 ac自动机模板题,裸的多串匹配 代码: #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<queue> using namespace std; void read(int &x) { char ch; bool ok; for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar(…
实现功能——输入N,M,提供一个共计N个单词的词典,然后在最后输入的M个字符串中进行多串匹配(关于AC自动机算法,此处不再赘述,详见:Aho-Corasick 多模式匹配算法.AC自动机详解.考虑到有时候字典会相当稀疏,所以引入了chi和bro指针进行优化——其原理比较类似于邻接表,这个东西和next数组本质上是一致的,只是chi和bro用于遍历某一节点下的子节点,next用于查询某节点下是否有需要的子节点) type point=^node; node=record ex:longint;st…
题目描述 有$N$ 个由小写字母组成的模式串以及一个文本串$T$ .每个模式串可能会在文本串中出现多次.你需要找出哪些模式串在文本串$T$ 中出现的次数最多. 输入输出格式 输入格式: 输入含多组数据. 每组数据的第一行为一个正整数$N$ ,表示共有$N$ 个模式串,$1 \leq N \leq 150$ . 接下去$N$ 行,每行一个长度小于等于$70$ 的模式串.下一行是一个长度小于等于$10^6$ 的文本串$T$ . 输入结束标志为$N=0$ . 输出格式: 对于每组数据,第一行输出模式串…
AC自动机基本操作 (1) 在AC自动机中,我们首先将每一个模式串插入到Trie树中去,建立一棵Trie树,然后构建fail指针. (2) fail指针,是穿插在Trie树中各个结点之间的指针,顾名思义,就是当匹配失败的时候,用于引导p指针回溯,就和KMP算法中的next数组道理相同. #include<bits/stdc++.h> using namespace std; #define MAX 26 //字典树关键字为‘a’~‘b’ ]; //主串(文章) int n; //模式串共有n串…
Description: 输出有哪些模式串在文本串中出现次数最多,这个次数是多少 Hint: 多组数据,$ len_{文本串}<=10^6,\sum len_{模式串} <= 70*150 $ Solution: 模板题,详见代码 // luogu-judger-enable-o2 #include<bits/stdc++.h> using namespace std; const int mxn=2e6+5; char p[160][80],str[mxn]; int n,st[…
题目大意:给定 N 个模式串和一个文本串,求每个模式串在文本串中出现的次数. 题解:文本串在自动机上匹配的过程中,记录下自动机上每一个状态被访问的次数.对于访问到的节点 i,则状态 i 的后缀中存在的匹配串的出现次数都要增加 1.若每次都暴力跳 fail 树的话,复杂度无法得到保证.观察发现,对于每一个模式串,能够对其答案产生贡献的状态一定是 fail 树上的,以该模式串节点为根节点的子树中的节点表示的状态.因此,将 fail 树显示建立出来,在文本串匹配结束后做一次 dfs 即可求出所有的模式…
题目链接:简单版,增强版 简单版: #include <cstdio> #include <cstring> const int N=1e6+5,S=26; char s[N]; struct AC_Automaton { int cnt,q[N],val[N],fail[N],las[N],son[N][S]; // struct Node // { // int val,las,fail,son[S]; // Node *son[S];//指针太麻烦了.. // Node()…
题意:要你找到主串中每个模式串的个数. 思路:题目都没说是多组数据,结果没while(~)直接WA了,和上一题差不多,可以用map或者开个数组储存.指针要记得回收内存,不然MLE. #include<cstdio> #include<vector> #include<set> #include<map> #include<queue> #include<cstring> #include<string> #include&…