AC自动机是一个多模字符串匹配的自动机(网上说的),主要作用是在一个长串中同时进行多个字符串的匹配
基础芝士:
trie树(字典树)
烤馍片kmp单模字符串匹配
如果不会的建议去网上学一下(本篇讲解略过)
这里重点讲一讲AC自动机
(由于本蒟蒻不会指针,所以所有算法一律不使用指针,请神犇们谅解)
例:luogu3796 AC自动机(加强版)
其实AC自动机就是在trie树上构造KMP的next指针(在AC自动机中叫fail指针),然后进行匹配
举个例子:
模式串:
abab
abb
bab
匹配串:
aaabbbabababbba
AC自动机第一步:建立trie树!
建树过程略,反正建起的树长这样:
建树代码如下,基本和trie树代码接近:
void buildtree(char *p)
{
int l=strlen(p);
int now=0;
for(int i=0;i<l;i++)
{
int t=p[i]-'a'+1;
if(tree[now].to[t]==0)
{
tree[now].to[t]=++cnt;
tree[tree[now].to[t]].fa=now;
tree[tree[now].to[t]].ca=t;
}
now=tree[now].to[t];
}
tree[now].ed++;
}
接下来我们考虑构造fail指针
fail指针的含义其实就是:如果在这一位上失配了,那么整个串不必从头开始,而是直接从中间的某处开

AC自动机是一种用于多模字符串匹配的自动机,基于Trie树构建,并结合KMP的next指针(在AC中称为fail指针)。本文通过实例详细介绍了AC自动机的构造过程,包括如何建立Trie树、构造fail指针以及如何进行匹配查询操作。通过这个过程,可以高效地在一个长串中查找多个模式串的匹配情况。
&spm=1001.2101.3001.5002&articleId=82782723&d=1&t=3&u=94cc908d7da24381ad7ef086140cc2f0)

被折叠的 条评论
为什么被折叠?



