AC 自动机 学习笔记(暂存)

前言

AC 自动机并不是可以自动帮你 AC 的数据结构……

AC 自动机,可以简单地理解为 KMP+Trie 组成的东西。KMP 可以解决一个文本串对一个模式串的问题,AC 自动机则可以解决一个文本串对应多个模式串的问题。

前置芝士:

  • Trie 树;
  • KMP 大致原理(没学也无所谓,只是帮助理解)。

话不多说,进入正题。

原理概述

首先明确一个点:AC 自动机是基于 Trie 实现的。类似于 KMP 算法,AC 自动机也有自己独特的失配指针。

\large fail_u 为 Trie 树上节点 u 失配后应从哪里开始继续匹配。

如图是一个 AC 自动机:

是的,很乱。所以,我将详细讲解失配指针是怎么来的。

失配指针

首先,我们可以明确:对于任意节点 \large u\in \lbrack 1,n\rbrack\large fail_u 的深度一定小于 \large u 的深度(不然就不叫“失配”了)。 所以,我们可以通过 bfs 求出整个 \large fail 数组。

假设我们现在在 \large u 这个节点失配了,\large u 对应的字符是 \large c。那现在的思路就是重新找找看有没有其他的字符串是有着相同前缀的。但是,如果每一次都从根节点开始找,那就太费时了。

这时,我们将眼光投向了 \large u 的父亲 fa。根据条件,\large fail_{fa} 肯定已经求出来了。那么,如果 \large fail_{fa} 有 \large c 这个节点,那 \large fail_{u}=son_{​{fail_{fa},}_{x}}\large son 数组是 Trie 树的边)。这很容易理解:\large fail_{fa} 与 \large fa 前缀是相同的。如果 \large u 失配了,那么我们就去尝试一下另一边是否可行。

给个图吧:

 应该能理解了吧?

那么,问题来了:如果 \large fail_{fa} 没有 \large c 这个儿子呢?

待补充

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值