AC 自动机的用处:
查询目标串中出现了哪些模式串(即文本字符串 s 中出现了哪些字典中的单词)
一种字符串上的 DP
Fail 树应用
AC 自动机的算法分三步:
构建所有『单词』的 Trie 树
构建失配指针
模式匹配过程
1.void trie()
{
int now=0,l=strlen(st);
for (int i=0;i<l;i++)
{
int x=st[i]-'a';
if (!ch[now][x]) ch[now][x]=++tot;
now=ch[now][x];
}
is_end[now]=true;
}
2.自动机中一个节点 p 的失配指针,指向整个自动机中的某个节点p->fail(除了根节点,不能指向自己),满足 p->fail 所代表的字符串是 p 所代表的字符串的一个后缀,且最长。如果我们现在知道 p 的失配 p->fail,则可以求出 p 的儿子p->ch[x] 的失配:
取 tmp = p->fail
若 tmp->ch[x] 不为空或 tmp 为根节点,则退出循环;
反之,令 tmp = tmp->fail,重复
p->ch[x]->fail = tmp->ch[x]
将『空』设为根节点。
如果 p 没有 x 这个儿子,令 p->fail->ch[x] 为 p 的 ch[x]