AC自动机 LA 4670 Dominating Patterns】的更多相关文章

题目传送门 题意:训练指南P216 分析:求出现最多次数的字串,那么对每个字串映射id,cnt记录次数求最大就可以了. #include <bits/stdc++.h> using namespace std; const int N = 150 + 5; const int NODE = N * 70; const int LEN = 1e6 + 5; const int SIZE = 26; struct AC { int ch[NODE][SIZE], fail[NODE], val[N…
AC自动机大名叫Aho-Corasick Automata,不知道的还以为是能自动AC的呢,虽然它确实能帮你AC一些题目.=_=|| AC自动机看了好几天了,作用就是多个模式串在文本串上的匹配. 因为有多个模式串构成了一颗Tire树,不能像以前一样线性递推失配函数f了,于是改成了BFS求失配函数. 白书上那个last数组(后缀链接)的含义就是:在Tire树的某个分支上虽然没有遇到单词节点,但是某个单词可能是已经匹配上的字串的后缀. 举个栗子: 有两个模式串:aaabbb, ab 现在已经匹配了a…
题意:给定n个字符串和一个文本串,查找哪个字符串出现的次数的最多. 析:一匹配多,很明显是AC自动机.只需要对原来的进行修改一下,就可以得到这个题的答案, 计算过程中,要更新次数,并且要映射字符串.如果用KMP肯定会超时. 代码如下: #include <iostream> #include <cstdio> #include <cstring> #include <map> #include <string> #include <queu…
题意:给定一个一篇文章,然后下面有一些单词,问这些单词在这文章中出现过几次. 析:这是一个AC自动机的裸板,最后在匹配完之后再统计数目就好. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <ios…
UVAlive 4670 Dominating Patterns 题目:   Dominating Patterns   Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description The archaeologists are going to decipher a very mysterious ``language". Now, they kno…
题意:多个模板串,一个文本串,求出那些模板串在文本串中出现次数最多. 解法:AC自动机入门模板题. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #include <string> #include <vector> #in…
AC自动机的裸题.学了kmp和Trie以后不难看懂. 有一些变化,比如0的定义和f的指向,和建立失配边,以及多了后缀连接数组last.没有试过把失配边直接当成普通边(一开始还是先这样写吧). #include<bits/stdc++.h> using namespace std; , maxnds = *+, sigma_size = , maxsubs = ; char str[maxlen]; #define idx(x) x-'a'; int last[maxnds];//后缀连接 为0…
在文本串中找出现次数最多的子串. 思路:AC自动机模板+修改一下print函数. #include<stdio.h> #include<math.h> #include<stdio.h> #include<stdlib.h> #include<iostream> #include<string> #include<memory.h> #include<map> #include<queue> usi…
input n 1<=n<=150 word1 word2 ... wordn 1<=len(wirdi)<=70 s 1<=len(s)<=1000000 output 最多出现次数 出现最多的串,按输入顺序输出,可能出现相同串,也要输出 做法:用一个end数组记下每个串结尾的字符的下标,对应val为1,每次找到就将val++,然后找到最大的val,输出最大val对应的字符串 #include <cstdio> #include <queue>…
题目传送门 快速的通道I 快速的通道II 题目大意 给定一堆短串,和一个文本串,问哪些短串在文本串中出现的次数最多. 我觉得刘汝佳的做法,时间复杂度有问题.只是似乎这道题短串串长太短不好卡.比如给出的串是一坨$a$.暴力跳$last$会比较gg. 考虑如何计算一个短串在长串中的出现次数. 当短串在长串的某个位置出现的时候,这意味着它的结束位置在fail树上的祖先中某个状态是短串的终止状态. 我们会在长串经过的每个状态都去做这样一个操作来统计每个短串出现的次数. 这个可以看成在fail树上的以根为…
题目传送门 题意:训练指南P250 分析:DFS记忆化搜索,范围或者说是图是已知的字串构成的自动机图,那么用 | (1 << i)表示包含第i个字串,如果长度为len,且st == (1 << m) - 1则是可能的.打印与之前相似. #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 25 + 5; const int NODE = 10 * 10 + 5;…
描述 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2671 给出一个字符串和一些子串,求其中出现次数最多的子串. 分析 在AC自动机上面跑就行了.但是有一个要注意的地方,就是在输入文件里同一个子串重复出现.如果不特殊处理的话,后一个子串就会把Trie里的前一个子串覆盖掉.,所以我们可以用个map... #include &…
今天花了半天肝下AC自动机,总算啃下一块硬骨头,熬夜把博客赶出来.. 正如许多博客所说,AC自动机看似很难很妙,而事实上不难,但的确很妙.笼统地说,AC自动机=Trie+KMP,但是仅仅知道这个并没有什么用,该写不出来的还是写不出来,必须理解每一步的精确含义.KMP算法的精髓是"用自己匹配自己",即:如果前i个字符失配时应该转移到第j个字符,那么前i+1个字符失配时应该比较i+1与j+1处的字符.AC自动机是一样的道理,只不过将图画在一颗Trie上,看起来不像KMP那样直观.用语言去描…
题目大意:找出出现次数最多的模式串. 题目分析:AC自动机裸题. 代码如下: # include<iostream> # include<cstdio> # include<map> # include<queue> # include<cstring> # include<algorithm> using namespace std; const int N=20000; int ch[N][26]; string p[155];…
题目大意 给定n个由小写字母组成的字符串和一个文本串T,你的任务是找出那些字符串在文本中出现的次数最多 题解 一个文本串,多个模式串,这刚好是AC自动机处理的问题 代码: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <string> #include <queue>…
题目大意:给出多个字符串模板,并给出一个文本串,求在文本串中出现最多的模板,输出最多的次数并输出该模板(若有多个满足,则按输入顺序输出). 思路:赤裸裸的 AC自动机,上模板. 代码: #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<queue> #include<algorithm> #include<cmath&…
https://vjudge.net/problem/UVALive-4670 中文题面:https://www.luogu.org/problem/show?pid=3796 AC自动机模板 注意如果有重复字符串,要输出所有的重复字符串 可以用重复字符串中标号最小的字符串来表示所有的重复字符串 例: aba abba aba aba出现了2次, 令mp[1]=mp[3]=1 代码实现的话,只需要在insert的最后判断, 如果这个单词节点还没有标记,标记上这个单词的编号 如果有标记,令当前单词…
题意:给一个字典,看这个字典中匹配最多次数的是哪个单词(可以有多个). 分析: AC自动机就是用来解决多模式匹配问题的工具. 模板用的lrj的,相比HDU 2222,动态开辟字典树.用last数组统计字典. 统计每一个单词匹配的次数cnt[],下标唯一对应val,最后遍历一遍cnt. #include <bits/stdc++.h> using namespace std; ; ; +; map<string,int> ms; struct Aho { int ch[MAXNODE…
Dominating Patterns 每次看着别人的代码改成自己的模板都很头大...空间少了个0卡了好久 裸题,用比map + string更高效的vector代替蓝书中的处理方法 #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <queue> #include <…
第二道AC自动机的题目了,之前参考的是网上一个博客算法,不怎么好,难写而且占空间 后来参照大白书做的这题,代码简洁多了 #include <iostream> #include <cstdio> #include <cstring> #include <map> #include <string> #include <queue> #define N 12000 using namespace std; map<string,i…
Dominating Patterns Time Limit:3000MS   Memory Limit:Unknown   64bit IO Format:%lld & %llu Description The archaeologists are going to decipher a very mysterious ``language". Now, they know many language patterns; each pattern can be treated as a…
UVA1449 Dominating Patterns 题目描述 有N个由小写字母组成的模式串以及一个文本串T.每个模式串可能会在文本串中出现多次.你需要找出哪些模式串在文本串T中出现的次数最多. 输入输出格式 输入格式: 输入含多组数据. 每组数据的第一行为一个正整数N,表示共有N个模式串,1≤N≤150. 接下去N行,每行一个长度小于等于70的模式串.下一行是一个长度小于等于10^6 的文本串T. 输入结束标志为N=0. 输出格式: 对于每组数据,第一行输出模式串最多出现的次数,接下去若干行…
Oulipo Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6227    Accepted Submission(s): 2513 Problem Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, wit…
描述 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2463 给出一些子串.然后给出一些字符,以及每个字符出现的概率.现在用这些字符组成一个长度为s的字符串,问之前给出的子串都没有在这个字符串中出现的概率是多少. 分析 边选字母边匹配.只要前面的字串都不能匹配成功即可.用前面的那些子串造出个AC自动机,然后在上面跑.用match数组表示每…
The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e'. He was a member of the Oulipo group. A quote from the book: Tout avait Pair normal, mais tout s’affirmait faux. Tout avait Fair normal, d’abord, pu…
题目链接 问题描述 给定n个单词,给定一个长字符串s,单词总长度和字符串s的长度都不超过1e5.要求把s中所有的出现单词的位置用*替代. 例如: 样例输入 2 abc cd abcxyzabcd 样例输出 ***xyz**** 关键一点在于:先找到应该打*的全部字符,然后再统一改写成*,也就是要考虑abcd同时命中abc和cd的情况. 思路 AC自动机是算法世界中最美妙的事物之一.它像一个大合唱一样,过去的KMP.字典树.树形DP.有限状态自动机一股脑地来了,聚合在一起,最终完美地达到了O(N)…
为何scanf("%s", str)不需要&运算 经常忘掉的字符串知识点,最好不加&,不加&最标准,指针如果像scanf里一样加&是错的,大概是未定义行为 马拉车 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<queue> using…
The Dominator of Strings Time Limit: 3000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 2830    Accepted Submission(s): 1010 Problem Description Here you have a set of strings. A dominator is a string of the…
Problem Description Here you have a set of strings. A dominator is a string of the set dominating all strings else. The string S is dominated by T if S is a substring of T .   Input The input contains several test cases and the first line provides th…
大家都不喜欢指针,但是这个AC自动机仿佛不用不行…… 先引用我最喜欢的话:“AC自动机,不是自动AC的机器.” 如果写不好还可能一直WA AC自动机是KMP与Trie树的完美结合,适用于多字符串匹配,这与KMP的单串不同 首先是一棵Trie树 记得建空节点做根,有大神忘记了建,直想砸键盘. 然后标准建树 如果用指针的话申请空间冷静一点 下一步就是构建fail指针,虽然我喜欢把它叫next,与KMP一致 幸好找到了好的版子,不然就很难搞 因为fail指针的构建顺序必须由上到下 即:fail是从下面…