AC自动机模板(hdu2222)
摘要:拜读了大牛们的代码,对AC自动机的了解又加深了一步。 不过刚才去一个QQ群推荐的题集里看了下,里面的题目还是不能顺利的解决,看来还需要更深入的去了解。 下面是hdu2222的题解,感觉可以作为不错的AC自动机模板代码。#include<iostream>usingnamespacestd;constintkind=26;structnode{node*fail;//失败指针node*next[kind];//Tire每个节点的26个子节点(最多26个字母)intcount;//是否为该单词的最后一个节点node(){//构造函数初始化fail=NULL;count=0;memset
阅读全文
posted @
2011-10-10 23:04
追逐.
阅读(703)
推荐(0)
AC自动机(转)
摘要:首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。要搞懂AC自动机,先得有模式树(字典树)Trie和KMP模式匹配算法的基础知识。AC自动机算法分为3步:构造一棵Trie树,构造失败指针和模式匹配过程。 如果你对KMP算法和了解的话,应该知道KMP算法中的next函数(shift函数或者fail函数)是干什么用的。KMP中我们用两个指针i和j分别表示,A[i-j+ 1..i]与B[1..j]完全相等。也就是..
阅读全文
posted @
2011-10-01 19:16
追逐.
阅读(291)
推荐(0)
Trie树结构(AC自动机前奏)(转)
摘要:Trie树就是字符树,其核心思想就是空间换时间。举个简单的例子。给你100000个长度不超过10的单词。对于每一个单词,我们要判断他出没出现过,如果出现了,第一次出现第几个位置。这题当然可以用hash来,但是我要介绍的是trie树。在某些方面它的用途更大。比如说对于某一个单词,我要询问它的前缀是否出现过。这样hash就不好搞了,而用trie还是很简单。现在回到例子中,如果我们用最傻的方法,对于每一个单词,我们都要去查找它前面的单词中是否有它。那么这个算法的复杂度就是O(n^2)。显然对于100000的范围难以接受。现在我们换个思路想。假设我要查询的单词是abcd,那么在他前面的单词中,以b,c
阅读全文
posted @
2011-10-01 19:15
追逐.
阅读(351)
推荐(0)
KMP算法(AC自动机前奏)(转)
摘要:我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法。KMP算法是拿来处理字符串匹配的。换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串)。比如,字符串A="I'm matrix67",字符串B="matrix",我们就说B是A的子串。你可以委婉地问你的MM:“假如你要向你喜欢的人表白的话,我的名字是你的告白语中的子串吗?” 解决这类问题,通常我们的方法是枚举从A串的什么位置起开始与B匹配,然后验证是否匹配。假如A串长度为n,B串长度为m,那么这种方法的复杂度是O (mn)的。虽然很多时候复杂度达不
阅读全文
posted @
2011-10-01 19:13
追逐.
阅读(406)
推荐(0)