题意:一个文本串+多个模板串的匹配问题 思路:裸的ac自动机. #pragma comment(linker, "/STACK:10240000,10240000") #include <iostream> #include <cstdio> #include <algorithm> #include <cstdlib> #include <cstring> #include <map> #include <…
Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 27138    Accepted Submission(s): 8871 Problem Description In the modern time, Search engine came into the life of everybody like…
AC自动机模板,注意!ch,Fail,lab数组的大小不是n而是节点个数,需要认真计算! #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cmath> #include <ctime> #include <cstdlib> #include <queue> using namespac…
ac自动机说起来很复杂,其实和kmp是一样的思路,都是寻找相同前后缀,减少跳的次数.只要理解了kmp是怎么求next数组的,ac自动机bfs甚至比knp还好写. 这里大致说一下kmp求next数组的方法吧,假设现在要求第c个字符的next值(假设这个c很大,这样画图出来比较清晰方便理解),因为遍历过程中我们已经知道了第c-1个字符的next为x(假设比c小很多),即next[c-1] = x.那就代表我们知道了a[1]—a[x]这一段和a[c-1-x]—a[c-1]这一段是相等的对吧. 那么现在…
AC自动机 转载自:小白 还可参考:飘过的小牛 1.KMP算法: a. 传统字符串的匹配和KMP: 对于字符串S = ”abcabcabdabba”,T = ”abcabd”,如果用T去匹配S下划线部分是当前已经匹配好的前缀,当c和d不匹配时: S:abcabcabdabba            T:abcabd 传统的算法是将T串向后移动一个单位,然后重新匹配.如果利用KMP算法则直接将T向后移动3位,即: S:abcabcabdabba            T:       abcabd…
AC自动机模板题. 被卡内存了 死活A不掉.. AC自动机参考教程: http://www.cppblog.com/menjitianya/archive/2014/07/10/207604.html ; type arr=record next:..] of longint; fail,cnt:longint; end; var cas:longint; s:..maxn] of string; T:..] of arr; id:array['a'..'z'] of longint; rt,t…
Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 48520    Accepted Submission(s): 15473 Problem Description In the modern time, Search engine came into the life of everybody lik…
首先要明白AC自动机是干什么的: AC自动机其实就是一种多模匹配算法,那么你可能会问什么叫做多模匹配算法.下面是我对多模匹配的理解,与多模与之对于的是单模,单模就是给你一个单词,然后给你一个字符串,问你这个单词是否在这个字符串中出现过(匹配),这个问题可以用kmp算法在比较高效的效率上完成这个任务.那么现在我们换个问题,给你很多个单词,然后给你一段字符串,问你有多少个单词在这个字符串中出现过,当然我们暴力做,用每一个单词对字符串做kmp,这样虽然理论上可行,但是时间复杂度非常之高,当单词的个数比…
AC自动机是用来干什么的: AC自动机是用来解决多模匹配问题,例如有单词s1,s2,s3,s4,s5,s6,问:在文本串ss中有几个单词出现过,类似. AC自动机实现这个功能需要三个部分: 1.将所有单词用字典树的方法建树 2.构建失配指针 3.在文本串中的查找函数 这里主要讲2和3 一.建树 ][],vis[],fail[]; ; string s,ss; void insert()//建树 { root=; ;s[i];i++) { id=s[i]-'a'; ) tree[root][id]…
病毒侵袭持续中 HDOJ-3065 第一个需要注意的是树节点的个数也就是tree的第一维需要的空间是多少:模板串的个数*最长模板串的长度 一开始我的答案总时WA,原因是我的方法一开始不是这样做的,我是在查找文本串的时候,结束的时候再来统计每个模板串出现的次数,但是这样似乎不行 这道题还有一个坑就是输入是多组数据... //AC自动机,复杂度为O(|t|+m),t表示文本串的长度,m表示模板串的个数 #include<iostream> #include<cstring> #incl…
完全忘了AC自动机怎么写了qwq,更别说AC自动机上DP了. 今天就好好地学习字符串好了qwq 提一下AC自动机的时间复杂度--设n是模式串的个数,m是文本串的长度,l是模式串的平均长度,那么它的时间复杂度就是\(O(n+m)*l\). AC自动机上fail指针指向的点,从root到它代表的是其后缀. 简单版:给定一个文本串,和多个模式串.求有多少个模式串在文本串中出现过.qwqwq #include<iostream> #include<cstring> #include<…
ac自动机算法正确性还没有理解,算法导论也看不懂..等懂了回来发算法专题. #include <cstdio> #include <cstring> using namespace std; ; int n; char s[maxn]; class AC{ public: struct node{ node *son[], *fail; int mark; }root, *now, *nowson, *p; AC(){} void insert(char *s, int len){…
传送门 解题思路 AC自动机,是解决多模匹配问题的算法,是字典树与kmp结合的算法,可以解决许多子串在文本串中出现的次数等信息.关键是实现一个fail指针,是指向更靠上的前缀相同字母,从而可以实现在文本串中跳的操作. 代码 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<queue> using namespace std; co…
#include<iostream> #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; *+; struct node{ ],f,v,cnt; ,;} }ch[maxn]; ],t[]; int tot,q[maxn],head,tail,T,n; void add(ch…
模板 #include<queue> #include<stdio.h> #include<string.h> using namespace std; ; ; ; struct Aho{ struct StateTable{ int Next[Letter]; int fail, cnt; }Node[Max_Tot]; int Size; queue<int> que; inline void init(){ while(!que.empty()) qu…
#include <cstdio> #include <cstring> #include <iostream> #include <cstdlib> #include <algorithm> #include <queue> using namespace std; + ]; ][ + ]; struct AcAutomaton{ + ; ; int size; int ch[N][C], fail[N], num[N], end[…
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7381    Accepted Submission(s): 1935 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一遇的世界奇观,那是多么幸福的事儿…
http://acm.split.hdu.edu.cn/showproblem.php?pid=2222 #include <cstdio> #include <cstdlib> #include <cstring> + ; ; struct AC { int son[maxn][N], fail[maxn * N], endPos[maxn * N]; int t, root; int create() { ++t; ; i < N; ++i) son[t][i…
Ac_automaton的板子打熟以后发现碰到题不会做,而且还是比较纯的板子,只要改几处地方就可以,Ac_automation有许多优秀而fantasy的性质,下面粘几个题,来记录一下做题的心得. 1.Keywords Search 这个题最大的问题是我们很可能漏掉一些解.建Ac_automaton(Trie图),额外维护一个size变量,在单词末尾++. 然后我们拿主串在Ac_automaton上面跑,每次都遍历其fail链(及所有前缀fail),因为fail指向某个串的最长后缀,只要把siz…
字典树也可以做. #include<stdio.h> #include<string.h> #include<stdlib.h> #define maxn 1000010 struct ac_mation { ac_mation *fail;//失败指针 ac_mation *next[];//26个字母 int flag;//标记是否为最后一个点 init(){//函数初始化 flag=; fail=NULL; ;i<;i++) next[i]=NULL; }…
http://acm.hust.edu.cn/vjudge/problem/16403 题意:给定n个单词,一个字符串,问字符串中出现了多少个单词.(若单词her,he,字符串aher中出现了两个单词) 题解: 每个单词末尾节点sum=1:find的时候每个点都顺着fail往上跳,加上该节点的sum,然后将这个sum清了:注意同一个单词出现多次只算一次. #include<cstdio> #include<cstdlib> #include<cstring> #incl…
题目大意:统计一共出现了多少次模板串. 题目分析:AC自动机的模板题.不过这题有坑,相同的模板串不能只算一次. 代码如下: # include<iostream> # include<cstdio> # include<queue> # include<map> # include<string> # include<cstring> # include<algorithm> using namespace std; co…
AC自动机是一种多模式匹配的算法.大概过程如下: 首先所有模式串构造一棵Trie树,Trie树上的每个非根结点都代表一个从根出发到该点路径的字符串. 然后每个结点都计算出其fail指针的值,这个fail指针就指向这个结点所表示字符串的最长存在的后缀所对应的结点,如果不存在就指向根:计算每个结点的fail用BFS,比如当前结点u出队要拓展并计算其孩子结点的fail,v是其第k个孩子,fail[v]的值就是某个fail[fail[fail...[u]]]存在第k孩子结点其第k个孩子结点,如果不存在f…
题意:给你一个长度为n的单词表,一个文本串,问你这个文本串中出现了单词表中多少个单词: 解题思路:ac自动机的模板题,可以直接当模板用: 代码: #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; const int maxn=1005000; struct node { node *next[27]; node *fai…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过: 本题就是最基础的模板:在此之前需要理解kmp和字典树(trie); Trie树有3个基本性质: (1) 根节点不包含字符,除根节点外每一个节点都只包含一个字符: (2) 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串: (3) 每个节点的所有子节点包含的字符都不相同. 1.…
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,在fail边的基础上再加一个last边,指向真正有效的节点,跳fail边改成跳last边来跳过无效点. AC自动机 #include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> PII; ; struct…
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=2222 题目: Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 56558    Accepted Submission(s): 18493 Problem Description In the mo…
Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 35655    Accepted Submission(s): 11496 Problem Description In the modern time, Search engine came into the life of everybody like…
题目大意: 给出多个模式串和一个主串,求多少个模式串在主串中出现过. 传送门 这是一道AC自动机的模板题. 在学习AC自动机之前,首先要学习WA自动机.TLE自动机和MLE自动机(雾 AC自动机是一种多模式串匹配算法. AC自动机概述: *fail指针:指向失配时的匹配节点: 1)构建字典树 2)初始化fail指针: 一条$fail$指针链可以理解为一个串连所有后缀相同的字符串的链表,并且所有链表的末端都指向trie的根.我们定义沿着节点$v$的$fail$指针走到根部的路径为v的trie链表.…
题面 Description 对,这就是裸的AC自动机. 要求:在规定时间内统计出模版字符串在文本中出现的次数. Input 第一行:模版字符串的个数N. 第2->N+1行:N个字符串.(每个模版字符串的长度<=50) 第N+2行:一行很长的字符串.长的很.(使用AC自动机能在1s内计算出) Output 共N行,每行输出一个模版及出现的次数.(之间有一个空格,按照输入顺序输出) Sample Input 4 hers her his she shershisher Sample Output…