原文:经典算法题每日演练——第八题 AC自动机 上一篇我们说了单模式匹配算法KMP,现在我们有需求了,我要检查一篇文章中是否有某些敏感词,这其实就是多模式匹配的问题。
当然你也可以用KMP算法求出,那么它的时间复杂度为O(c*(m+n)),c:为模式串的个数。m:为模式串的长度,n:为正文的长度,那...
分类:
编程语言 时间:
2015-01-16 12:48:17
阅读次数:
374
Knuth-Morris-Pratt算法(简称KMP),以三个发明者命名,起头的那个K就是著名科学家Donald Knuth一、什么是KMP算法假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++,继续匹配...
分类:
编程语言 时间:
2015-01-15 17:41:34
阅读次数:
266
题意:
给一个二维字符数组和w个模式串,求这w个模式串在二维字符数组的位置。
分析:
静态trie树。
代码:
//poj 1204
//sep9
#include
using namespace std;
const int maxN=1024;
const int maxM=270*maxN;
char str[maxN][maxN];
char s[maxN];
int vis[...
分类:
其他好文 时间:
2015-01-15 14:23:54
阅读次数:
141
题目大意:给定n个模式串,定义一个字符串的伤害为所有子串的划分中最多包含的模式串数量,求长度为len的字符串的伤害期望值
小五prpr,恋恋prpr,大小姐prpr
首先建立AC自动机 令f[i][j]表示长度为i的字符串在AC自动机上的第j个节点的伤害期望值
如果要走到某个节点是危险节点或者fail指针指向危险节点,就ans++,然后回到根节点
这样构造出来的矩阵做快速幂= = 这么做都...
分类:
其他好文 时间:
2015-01-13 09:02:00
阅读次数:
205
关于自动机,其实可以最简单的理解为,对于一个给定的初始状态,算法可以自动进行递归得出最终匹配或者不匹配两种情况。AC自动机试自动机的一种(Aho-Corasick automation),该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。所谓多模匹配,指的是同时匹配多个模式串,我们通.....
分类:
其他好文 时间:
2015-01-08 22:41:10
阅读次数:
244
题目:给你一个长目标串str,和一些模式串,求每个串出现的次数。模式串有可覆盖和不可覆盖两种。
分析:字符串,多串匹配,AC自动机。由于数据有可能不允许相交,所以记录上一个的结束位置。
题目的数据比较猥琐,可能相同,采用一个 Fath域记录第一次出现的 id,计算一次就可以了。
说明:注意数据有相同的串;该题可以使用 RK算法+二分。
#include
#incl...
分类:
其他好文 时间:
2014-12-23 14:01:51
阅读次数:
210
Problem DescriptionYB打算写一个功能强大的文本编辑器,并取一个炫酷拉风,高端优雅的名字,比如“YB牌文本编辑器”之类的。既然功能强大,那肯定得有个查找功能吧。但是他在完成这个功能的时候遇到一点小问题。现在来请求你的帮助。给你一个文本串s和一个模式串t,你需要写一个程序来查找t在s...
分类:
其他好文 时间:
2014-12-19 20:40:36
阅读次数:
206
题目大意:给定n个目标串和m个模式串,问这m个模式串每个在多少个目标串中出现过,以及n个目标串每个以最多多少个模式串为子串
我错了……就算用fail树+set启发式合并也优化不到O(nlog^2n)……这题的数据范围相当无解啊
首先将所有名字和点名的字符串全都插进AC自动机
将每个点上开一个set记录这个点是哪些喵星人的名字的前缀
然后建立fail树 沿着fail树从下到上启发式合并
每...
分类:
其他好文 时间:
2014-12-09 09:21:35
阅读次数:
286
题目大意:给定n个模式串,求长度为m的至少含有一个模式串的字符串共有多少种
照例,令f[i][j]表示长度为i的字符串与AC自动机上的第j个点匹配的方案数
直接DP很难,我们考虑补集法,即用26^m减去不含任何模式串的字符串的数量
后者就是经典的AC自动机DP模型啦~~
#include
#include
#include
#include
#define MOD 10007
us...
分类:
Web程序 时间:
2014-12-08 13:59:56
阅读次数:
208
我们来看一道题目:hihoCoder #1015 : KMP算法 输入 第一行一个整数N,表示测试数据组数。 接下来的N*2行,每两行表示一个测试数据。在每一个测试数据中,第一行为模式串,由不超过10^4个大写字母组成,第二行为原串,由不超过10^6个大写字母组成。 其中N
#include
usi...
分类:
编程语言 时间:
2014-12-04 13:50:52
阅读次数:
178