AC自动机(Aho-Corasick automaton)是用来处理多模式匹配问题的。
基本可认为是TrieTree+KMP。其中KMP是一种单模式匹配算法。
AC自动机的构造要点是失败指针的设置,用于匹配失败时跳转到另一节点继续匹配。同时在匹配的过程中也用来检索其他“同尾”的模式。
失败指针的设置:
用BFS。
对于每个节点,我们可以这样处理:设这个节点上的字母为C,沿着他父亲的失败指针走,直到走到一个节点,他的儿子中也有字母为C的节点。然后把当前节点的失败指针指向那个字目也为C的儿子。如果一直走到了root都没找到,那就把失败指针指向root。
最开始,我们把root加入队列(root的失败指针显然指向自己),这以后我们每处理一个点,就把它的所有儿子加入队列,直到全部设置完毕。
要点1:root的孩子的那一层比较特殊,若按照上述算法,它们的失败指针会指向自己,这会在匹配的过程中导致死循环。显然root的子节点的失败指针应指向root,我们应对这一层单独处理。
要点2:沿着父节点的失败指针走到root之后并不是立即将子节点的失败指针设置为root,而是在root的子节点中找寻字母为C的节点,将它设置为失败指针。若没有才设置为root。这样不会丢失模式只有一个字母的情况。
匹配过程: