AC自动机,听名字就让人心情愉悦,这个算法能让题目直接自己AC啊!!!
言归正传,在上一篇字典树的学习中,我们见识到了树形结构的优势,那么AC自动机就是在字典树上利用KMP的思想,KMP是字符串匹配算法。主要思想是当前匹配点失败后,立刻转移到下一个需要匹配的地方,在这之间省略一些没有必要的检索,有利于降低时间复杂度。
字典树的模板参照我之前一篇博客C++学习第八篇——字典树,本专栏c++固定算法为主,便于学习,不定时穿插发布。
先解释原理然后再上代码进行分析讲解,
首先,举一个例子,我利用her、he、shr、say、she这五个单词建立了一个字典树。然后给出字符串yasherhs,需要求出上述单词出现的个数。
按照常规思路来看我们每找到一个符合条件的就需要到字典里去找,然后再接着找下一个字母开头的,对于有着相同开头的单词来说,这无疑大大增加了时间复杂度。利用KMP思想来看,如果我把相同的前缀进行标注,那么我回溯的过程就很方便了,不需要遍历相同的前缀即可完成。
AC自动机具体步骤如下:
- 建字典树
给出建树代码
与普通字典树相比,略有改动,补充了注释
struct node
{
char *s;
int prefix;
bool isword;//可省略,利用count代替
node *next[26];
node *fail; //fail指针
int count;//标记单词个数,如果出现单词重复需使用count代替isword
node()
{
s = NULL;
fail = NULL;//初始化为空
prefix = 0;
count = 0;//单词数0
isword = false;
memset(next,0,sizeof(next));
}
}*root;
void insert(node *root,char *s)//插入单词
{
node *p = root;
for(int i=0;s[i];i++

本文深入讲解AC自动机的原理及应用,通过实例演示如何利用KMP思想优化字典树,实现高效字符串匹配。介绍了AC自动机的构建过程,包括字典树的建立、fail指针的设置以及字符串搜索算法。
最低0.47元/天 解锁文章
2219

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



