AC自动机(Aho-Corasick)主要用于多模式串的匹配问题,是前缀匹配搜索的一种方法,和KMP算法的思想类似。
总所周至,KMP算法中的关键next指针利用了模式串本身的性质,在失配时给出了重新匹配的位置。AC自动机中的fail指针也是一样,fail指针的构造关键是找到即是当点匹配串的后缀,又是trie中一个模式串的前缀的最长的字符串。
DFA是确定性有穷自动机,用于正则表达式的匹配,AC自动机可以用来构造DFA,将trie树中的节点看成是DFA中的状态,字符的匹配看成DFA的转化关系,再做一定的处理即可完成
AC自动机本质上来说是一种基于trie树的kmp算法。下面是AC自动机和DFA实现的代码:
#include <queue>
#include <cstdio>
#include <cstring>
#include <cassert>
#include <algorithm>
#include <functional>
using namespace std;
struct AhoCorasick {
static const int UNDEF = 0;//非终结标识符
static const int MAXN = 2048;
static const int CHARSET = 2;
i