AC 自动机学习笔记

这篇具有很好参考价值的文章主要介绍了AC 自动机学习笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

AC自动机(\(Aho\ Corasick\ Atomaton\))有着一种 \(KMP\) 的思想,所以在学习之前建议先学一下 \(KMP\)。同时还需要了解一下 \(Trie\) 树(建议去看一下 oi-wiki 上的字典树)

问题描述

给定一个字符串 \(S\)\(n\) 模式串,问有多少个模式串在 \(S\) 中出现过。

首先我们把 \(n\) 个模式串组成一个 \(Trie\)(就当你们学会了 \(Trie\) 树)
AC 自动机学习笔记

模式串:\(ABC,BCD,BD,C\),其中绿色的点表示字符串的结尾。

对于 \(|S|=ABCBCD\),那么我们在 \(Trie\) 上开始匹配,最开始会经过 \(2,3,4\) 三个点到 \(4\) 的时候,发现已经成功匹配了一个模式串了,那么现在我们需要从根在匹配一次吗?

显然的,不需要,\(KMP\) 的思想可以运用在这个 \(Trie\) 树上,我们在匹配完 \(4\) 的时候可以直接来到 \(7\) 然后再匹配到 \(8\)

对于从 \(4\)\(7\) 这个步骤,我们称 \(7\)\(4\)\(Fail\)(失配指针)。

\(Fail\) 指针

刚才说了 \(Fail\) 是失配指针,那么如果此时匹配失败,那么就到达这个指针指向的位置,所以,失配指针指向的节点是当前节点所代表的串,最长的、能与后缀匹配的,且在 \(Trie\)
中出现过的前缀所代表的节点。

我们设点 \(x\) 的父亲的 \(Fail\) 指针指向的是 \(p\),那么如果 \(p\) 的儿子 \(y\)\(x\) 相同,那么 \(x\)\(Fail\) 指针指向的就是 \(y\)(应该挺好理解的吧)。

那么如果没有儿子呢?

那就再造一个儿子,就把当前节点的子节点指向当前节点的 \(fail\) 节点的子节点。

而且发现每个点 \(fail\) 指向的节点都比当前节点小,那么第二层的 \(fail\) 就指向根节点。

然后对于失配指针 \(Fail\) 我们需要使用 \(BFS\) 来实现。


inline void Get_fail(){
	for(int i=0;i<26;i++)
		if(ch[0][i])
			q.push(ch[0][i]),fail[ch[0][i]]=0;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=0;i<26;i++)
			if(ch[u][i]) fail[ch[u][i]]=ch[fail[u]][i],q.push(ch[u][i]);
			else ch[u][i]=ch[fail[u]][i];//没有子节点,就把当前节点的子节点指向当前节点的fail节点的子节点
	}
}

查询

首先,指针指向根节点,依次读入单词,检查是否存在这个子节点。

然后指针跳转到子节点,如果不存在,直接跳转到失配指针即可。


inline int query(string s){
	int len=s.size(),v=0,res=0;
	for(int i=0;i<len;i++){
		v=ch[v][s[i]-'a'];
		for(int j=v;j&&val[j]>=0;j=fail[j]){
			res+=val[j];
			val[j]=-1;
		}
	}
	return res;
}

时间复杂度:\(O(|\Sigma|M)\)\(| \Sigma |\) 一般来说是 \(26\))。文章来源地址https://www.toymoban.com/news/detail-679560.html

到了这里,关于AC 自动机学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 正规文法、正规表达式、有限自动机及其之间的转换(笔记)

    The Equivalent Transforming among RG, RE and FA A Grammar G is a quadruple (四元组):G = (V N , V T , S, P ) Where, V N is a finite set of nonterminals. V T is a finite set of terminals. S is the start symbol, S ∈ in ∈ V N . P is a finite set of productions (产生式). Regular Grammar (RG) (正规文法): α∈V N and β ∈V T ∪V T V N Regular Exp

    2024年02月08日
    浏览(28)
  • 【元胞自动机】元胞自动机3D森林火灾模型【含Matlab源码 656期】

    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信。 🍎个人主页:海神之光 🏆代码获取方式: 海神之光Matlab王者学习之路—代码获取方式 ⛳️座右铭:行百里者,半于九十。 更多Matlab仿真内容点击👇 Matlab图像处理(进阶版) 路径规划

    2024年04月29日
    浏览(27)
  • 【数学建模】元胞自动机

    元胞自动机(Cellular Automaton,简称CA) 元胞自动机(Cellular Automaton,简称CA)是一种离散空间和时间的计算模型。它由许多简单的计算单元(称为元胞)组成,每个元胞可以处于有限的状态之一。元胞自动机通过在空间上进行迭代更新的方式,根据元胞自身的状态和邻居元胞

    2024年02月15日
    浏览(27)
  • 数学建模-元胞自动机

    2024年02月14日
    浏览(28)
  • 元胞自动机(数学建模)

    一.元胞自动机的概念       元胞自动机(cellular automata,CA) 是一种时间、空间、状态都离散,空间相互作用和时间因果关系为局部的网格动力学模型,具有模拟复杂系统时空演化过程的能力。     元胞自动机是用一系列模型构造的 规则 构成,只要满足规则就可以算作是元胞

    2024年02月08日
    浏览(26)
  • KMP算法 - 确定有限状态自动机

    子串匹配问题,拍脑袋一下子想出来的暴力解法大抵都是两重for循环,不断重复扫描主串,与子串进行匹配,重复换句话讲就是冗余,会有很高的时间复杂度 我先前博客大作业发的 模糊查找算法 就是如此,我那里是在计算一个匹配度的问题,通过相同定位到相同字母判定开

    2024年02月09日
    浏览(33)
  • 【NLP】有限自动机的KMP算法

    目录 一、说明 二、无策略直接匹配法 2.1  简单粗暴的无脑匹配: 2.2 跳过外循环的思路

    2024年02月08日
    浏览(29)
  • 100行python代码实现细胞自动机(康威生命游戏)

     英国数学家约翰·何顿·康威在1970年发明了细胞自动机,它属于一种仿真程序,通过设定一些基本的规则来模拟和显示的图像的自我进化,看起来颇似生命的出生和繁衍过程,故称为“生命游戏”。 完成效果 用到的第三方库 pygame 基本规则 康威生命游戏在网格上进行,有填

    2023年04月08日
    浏览(24)
  • 不确定有穷自动机NFA的确定化

    从文件读入一个非确定有穷状态自动机(NFA),用子集法将其确定化,并输出一个确定化的有穷状态自动机(DFA)。 原理: 流程图如下: 具体代码实现: 这里为了实现图形可视化,使用了graphviz,下载完成Graphviz工具后,需将其添加至系统环境变量中,且需将其上移至Matl

    2024年02月07日
    浏览(25)
  • 元胞自动机( Cellular Automata)研究 (Python代码实现)

     👨‍🎓 个人主页: 研学社的博客   💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🌈

    2024年02月09日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包