C++学习第九篇——AC自动机

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

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++
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值