AC自动机【学习笔记】
概述
自动机是以为结构基础,为思想基础建立的,主要用于多模式串匹配。
在自动机上,所有的模式串构成一棵树,而且利用的思想,在上构造失配指针。
上的结点表示的是某个模式串的前缀,相当于一种状态,而上的边就相当于是状态的转移。
指针
先把所有的模式串放到,举例如下:
假如说现在要匹配的文本串是,我们去树上匹配,会经过号节点匹配到模式串,然后就不能继续匹配。
如果接下来重新从根结点开始,复杂度会很高,我们可以借用的思想,跳到去,就是的失配指针。
More officially,指针指向 / 模式串的前缀中 / 匹配 / 当前状态的最长后缀。(断句要断好)
也就是说,的失配指针,满足是的一个后缀,而且是所有满足中最大的那一个。
号点也满足条件,但是那里不是最长后缀,所以我们不跳到那里去。
下面是的求法:
设上当前的节点是,的父亲是,。
假设深度小于的所有结点的指针都已经求过。
1.存在,那么。的最长后缀的位置在,在的位置再加一个字符就一定的最长后缀的位置,因为只在一个确定的串后面加上一个字符而已。
2.如果不存在,那么就要一直跳指针(反复横跳),找,直到它存在,然后重复1.
3.如果真的不存在,那么把指向根。
具体可以用实现(有假设深度小于的所有结点的指针都已经求过)
可以理解为字典树上的一条边,也可以理解为一种状态转移,表示加上一个字符达到的状态。
代码实际上修改了的结构,但是使得匹配转移更加完善。它将 fail 指针跳转的路径做了压缩(就像并查集的路径压缩),使得本来需要跳很多次针变成跳一次。
匹配函数
是最难的部分,理解之后求答案就水到渠成了吧。
时间复杂度
【参考:OIwiki】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现