浅谈AC自动机

本文介绍了AC自动机的概念,强调了从Trie图到AC自动机的构建过程,特别是fail指针的作用。AC自动机可以无重复地遍历所有字符串,并通过fail树获取字符串公共后缀。文章还讨论了路径压缩在构建fail树中的应用,以及如何利用fail树进行子树求和以计算字符串出现的次数。通过一个NOI2011的例题,展示了AC自动机在解决字符串问题上的应用。
摘要由CSDN通过智能技术生成

浅谈AC自动机

建议学过 AC 自动机的人来看。

注意我们一开始直接建立串的时候是 T r i e \tt Trie Trie 图,之后建立 f a i l \tt fail fail 指针的时候才是真正的 A C AC AC 自动机。

具体来说对于 T r i e \tt Trie Trie 上深度从小到大的一条链,对应的是一个曾经在某个或者多个串中出现过的子串。

如果说是一条从根到底的链那本质就是代表一个串,显然对于一条链之间的点,本质上深度小的是深度大的前缀串。

用处:

  • 我们可以通过遍历 T r i e \tt Trie Trie 图来不重复地遍历每个字符串(不会有相交)。

还有一个东西叫 f a i l \tt fail fail 树,这个东西的定义和 n x t \tt nxt nxt 数组很类似,就是与当前串公共后缀最长的点。

那么我们一直沿着 f a i l \tt fail fail 树跳的话是可以遍历到所有与当前串后缀部分有交的串,而且是交是从大到小的。

注意

  • 我们进行找 f a i l \tt fail fail 指针的时候需要使用路径压缩,但是即使使用了路径压缩,我们直接建立 f a i l \tt fail fail 树的时候完全不会有影响。

  • 如果说拿节点 1 1 1 当做超级源点的话,对于周围一圈的不存在的点,需要路径压缩至点 1 1 1

用处:

  • 发现对于一个节点 x x x,在 f a i l \tt fail fail 树上的子树中的所有节点都是后缀包含其的节点。可以通过打标记,进行子树求和来得到该节点(字符串)出现的次数。

简单例题

[NOI2011] 阿狸的打字机

容易看出题目给的输入,就是建立 T r i e \tt Trie Trie 的方式。我们建立 f a i l \tt fail fail 树。

之后考虑 ( x , y ) (x, y) (x,y) 我们可以通过枚举 y y y 中的每一个点,判断其 f a i l \tt fail f

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
后缀自动机被广泛应用于OI竞赛中,特别是在字符串相关的问题中。它是一种高效的数据结构,能够有效地解决各种字符串匹配、模式匹配和计数等问题。 首先,后缀自动机可以用于解决最长公共子串和最长公共子序列等问题。对于给定的两个字符串,可以将其加入到后缀自动机中,并通过动态规划的方式求解最长公共子串或子序列的长度。 其次,后缀自动机还可以用于解决多次询问下的子串出现次数问题。通过构建全局后缀自动机,可以在O(n)的时间复杂度内预处理字符串,并在O(m)的时间复杂度内得出任意子串的出现次数,其中n为字符串长度,m为询问总数。 另外,后缀自动机还可以用于解决包含多模式匹配的问题。通过将模式串加入到后缀自动机中,并预处理自动机的fail指针,可以在O(n)的时间复杂度内找到所有模式串在文本中的出现位置。这在处理大规模的文本匹配问题时非常有用。 此外,后缀自动机还可以进行字符串的字典序统计。通过在构建自动机时记录每个节点的信息,可以在O(n)的时间复杂度内得到字符串的字典序第k小/大的子串。 总之,后缀自动机在OI竞赛中有着广泛的应用,能够解决各种字符串相关的问题。通过巧妙地构建自动机,并充分利用其性质,可以实现高效的字符串算法,为解决复杂的字符串问题提供了有力的工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值