字典树:
以树的形式存储字符串。便于进行快速检索以及最长公共前缀的获得。
结构体的构造:
① struct node{
int count;
node *next[26];
}
② struct node{
int count;
int next[26];
}
AC自动机:
字典树与KMP算法的结合。一般用于在一段字符串中查找多个模式串。
步骤:
1. 将所有的模式串构造成一棵字典树;
2. 为树上的每一个节点构造其FAIL指针(方法下述);
3. 将文章与树开始进行匹配。每到一个不匹配的地方,就把匹配的文章与其fail指针指向的树的节点进行匹配;如果在过程中发现匹配节点返回到了根,且一直没变,则说明文章中存在某个或些字符串与模式串不能匹配,需要将文章中的指针向后移动。
4. 每当匹配到树上的count值上一个节点大于下一个节点,就说明一个模式串匹配成功;
5. 直到文章匹配结束。
fail指针的构造:
1. 根节点的fail指针指向本身。
2. 其他节点的fail指针,如果其父节点的fail指针指向的节点的子节点与其值相等,则将其fail指针指向它;否则,向上寻找其父节点的fail指针的fail指针,直到找到为止,或者直到指向根节点。