你要堕落,神仙也救不了; 你要成长,绝处也能逢生。
AC自动机(简单版)
题目背景
这是一道简单的AC自动机模板题。
用于检测正确性以及算法常数。
为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交。
管理员提示:本题数据内有重复的单词,且重复单词应该计算多次,请各位注意
题目描述
给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过。
输入输出格式
输入格式:
第一行一个n,表示模式串个数;
下面n行每行一个模式串;
下面一行一个文本串。
输出格式:
一个数表示答案
输入输出样例
输入样例#1:
1 | 2 |
输出样例#1:
1 | 2 |
说明
subtask1[50pts]:∑length(模式串)<=10^6,length(文本串)<=10^6,n=1;
subtask2[50pts]:∑length(模式串)<=10^6,length(文本串)<=10^6;
题解
AC自动机最简单的实现
Code:
1 |
|
AC自动机(加强版)
题目描述
有NN个由小写字母组成的模式串以及一个文本串TT。每个模式串可能会在文本串中出现多次。你需要找出哪些模式串在文本串TT中出现的次数最多。
输入输出格式
输入格式:
输入含多组数据。
每组数据的第一行为一个正整数NN,表示共有NN个模式串,
接下去NN行,每行一个长度小于等于70的模式串。下一行是一个长度小于等于10^6106的文本串TT。
输入结束标志为N=0。
输出格式:
对于每组数据,第一行输出模式串最多出现的次数,接下去若干行每行输出一个出现次数最多的模式串,按输入顺序排列。
输入输出样例
输入样例#1:
1 | 2 |
输出样例#1:
1 | 4 |
题解
本来想先写一个暴力,然后再写各种优化(比如记忆化甚至自动机dp)
结果发现暴力AC了,虽然有点慢。
根据题意,一个单词显然要被计算多次,所以不能访问过就不算了。
注意记录节点的父亲以及连向它的边,方便输出。
Code:
1 |
|
「一本通 2.4 例 1」Keywords Search
题目描述
原题来自:HDU 2222
给定 nn 个长度不超过 5050 的由小写英文字母组成的单词准备查询,以及一篇长为 mm 的文章,问:文中出现了多少个待查询的单词。多组数据。
输入格式
第一行一个整数 TT,表示数据组数;
对于每组数据,第一行一个整数 nn,接下去 nn 行表示 nn 个单词,最后一行输入一个字符串,表示文章。
输出格式
对于每组数据,输出一个数,表示文中出现了多少个待查询的单词。
样例
样例输入
1 | 1 |
样例输出
1 | 3 |
数据范围与提示
对于全部数据,
题解
AC自动机的板子。
结果我还各种错。感觉虽然完全理解AC自动机的复杂度,正确性和工作原理,但是Trie图优化还是经常写错哎。。
Code:
1 |
|