1. AC自动机的功能:
用于多模匹配,所谓多模匹配,就是给定一个带匹配的字符串string,给定一个字典dictionary,dictionary中有多个字符串{ str1,str2, str3 … } 多模匹配就是要得到string字符串中出现了dictionary的哪些字符,且这些字符出现在了string中的哪个位置。
2. AC自动机的原理:
AC自动机的难点在于构建一个DFA(确定状态的有限状态自动机)。构建这个自动机分为两步:
1. 根据dictionary构建一棵前缀树trieTree。
2. 在对这棵trieTree进行BFS广度优先遍历的同时,为这棵树的节点增加边与fail指针。
2.1介绍什么是trieTree(前缀树)
前缀树是一种存储单词的数据结构,从树根遍历到每一片树叶(或者某些中间结点)都是一个单词,两个单词如果有相同的前缀,那么在这棵树上,从根节点到这个相同的前缀结束之前,这两个单词所对应的路径是重叠的。
上图中,从根节点到每个红色的节点经过的路径上的字母组成了一个字典中的单词。
以下是trieTree节点的结构:
typedef struct trieNode {
trieNode*next[KIND]; //初始化都为NULL ,该节点的孩子
trieNode *fail;
char value[50];//存放根节点到当前节点的路径上的值
int finalSig; //表明是否是某段字符串的最后一个值
} trieNode; //trie树的节点
2.2 如何在广度优先搜索的基础上为trieTree加边,同时增加fail指针,形成一个DFA
1. 对trieTree根节点的直接孩子做特殊处理:
For( int i=0; i<KIND