首页 > 其他分享 >AC 自动机

AC 自动机

时间:2024-11-10 21:46:41浏览次数:1  
标签:AC 匹配 trie fail 自动机 失配 节点 字典

OI-wiki Link and bilibili Link

AC 自动机,主要用于解决多模式串(即需要求出出现次数等的串)匹配的问题,基于字典树。

大致

将模式串建到字典树上,对每个字典树上的节点求出失配指针,根据失配指针建立失配树,用失配树来维护模式串出现次数。

具体构建

建立字典树

略。

失配 fail 指针

失配指针用于辅助多模式串匹配。

节点 \(x\) 的失配指针意思是其对应字符串 \(s\) 的最长可匹配(在字典树中能找到)后缀对应字典树的哪个节点。

由于是最长可匹配后缀,那么我们可以发现,只要我们不断枚举 fail[x], fail[fail[x]] ...,就可以把其每个可匹配后缀都枚举出来。

当字典树上一个节点 \(x\) 在后接一个字符 \(c\)、转移至 \(y\) 时(假设已经求出了 \(x\) 的 fail 指针),只需要枚举每个 \(x\) 的每个可匹配后缀,判断在其后面加上 \(c\) 是否有对应的节点即可。

但这样做的复杂度似乎不太对,考虑优化。

路径压缩优化(字典图)

为了避免反复枚举一个转移 \(a \xrightarrow{c} b\),可以按照深度去求 fail。枚举 \(x\) 和后接的一个字符 \(y\) 时,如果 \(x\) 没有一个 \(y\) 转移,则记录 \(trie_{x,y}=trie_{fail_x, y}\),将路径压缩存储下来,否则就更新 \(fail_{trie_{x,y}}=trie_{fail_x,y}\)。

由于这个操作改变了字典树的结构,所以也被称为建立字典图。

建立 fail 树

求出 fail 后,一般都需要用 fail 树来辅助维护答案。

顾名思义,就是以 \(fail_x\) 为 \(x\) 的父亲搭建出的一棵树,其性质是如果 \(x\) 对应字符串被成功匹配了一次,那么其父亲也必然会被成功匹配一次,可以用求子树内权值和的方式来求出现次数。

至此,AC 自动机的前置搭建已经完成,那么就是处理匹配的问题了。

处理匹配

仍然是在字典图上面处理,求出答案后把标记打在失配树上,最后用失配树来处理答案。

假设现在匹配到了 \(x\) 这个节点,后接一个字符 \(y\),如果字典图上有这个转移则直接转移过去,否则转移到 \(trie_{fail_x,y}\) 去,每接一个字符都要记得在失配树上对应节点打上一个标记。

最后求答案即可。

例题

模板模板+稍微修改,模板还有两个弱化版。

练习题:病毒

标签:AC,匹配,trie,fail,自动机,失配,节点,字典
From: https://www.cnblogs.com/wnsyou-blog/p/18538588/ac-automaton

相关文章

  • 2025年航天航空工程与材料技术国际会议(AEMT 2025) 2025 International Conference on
    @目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz三、大会介绍四、出席嘉宾五、征稿主题如想"投稿"请点击如下图片......
  • Sol - P2900 [USACO08MAR] Land Acquisition G
    完整准确地理解FlushHu的题解。0x00初步分析我们发现对于矩形\(i,j\)满足\(h_i\leqh_j,w_i\leqw_j\),那么选\(j\)的时候一定可以并购\(i\),因此将\(i\)删去。将剩下的矩形按照\(h\)从大到小排序,此时\(w\)从小到大。因为如果合并的不是一段连续区间,那么中间未被......
  • Refact.ai Match 1 (Codeforces Round 985)
    A.Set二分出最大数满足至少有\(k\)个倍数的数。#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;#defineinti64usingvi=vector<int>;usingpii=pair<int,int>;consti32inf=INT_MAX/2;constintmo......
  • postgresql事务与oracle中的事务差异
    事务事务ID及回卷参见postgresql中的事务回卷原理及预防措施。子事务(事务处理:概念与技术4.7)  子事务具有ACI特性,但是不具有D特性。只会在主事务提交时,才会提交,无法单独提交。pg不支持子事务。xact保存点保存点是不支持子事务/嵌套事务时的折中实现,但它是ANSISQL......
  • 使用react+copy-to-clipboard封装双击复制组件
    前言:最近在公司研发后台系统,用户反馈在双击某些信息时希望可以进行复制的操作,多处使用进而封装为组件首先:安装copy-to-clipboardnpmi--savecopy-to-clipboard其次:封装组件importReact,{memo,useCallback}from'react';import{notification}from"antd";......
  • 【优化求解】蚁群算法ACO求解经济损失的航班延误恢复优化问题(目标函数:航班延误成本最
    ......
  • P2893 [USACO08FEB] Making the Grade G 题目分析
    P2893[USACO08FEB]MakingtheGradeG题目分析题目链接分析题目性质不难解析出题目中的序列\(B\)有“单调不下降”和“单调不上升”两种情况,不难想到分两种情况讨论答案即可。有一个性质:在满足答案最小化的情况,一定存在一种方案使得\(B\)中的数字一定在\(A\)中。......
  • P2123 皇后游戏 / [USACO12JAN] Mountain Climbing S / P1248 加工生产调度 题解
    P2123皇后游戏/[USACO12JAN]MountainClimbingS/P1248加工生产调度先来看P2123。我们把这个特别重要的公式打出来:\[c_{i}=\begin{cases}a_{1}+b_{1}&,i=1\\\displaystyle\max\left\{c_{i-1},\sum_{j=1}^{i}a_{j}\right\}+b_{i}&,2\leqi\leqn\end{......
  • 更新教程:如何以 6 种新方式将视频从 Android 传输到 Mac
    概括我们的生活充满了多媒体内容,在设备之间无缝传输视频的需求变得越来越重要。对于寻求将其珍贵视频转移到Mac生态系统的Android用户,本指南提供了多种方法的全面概述,确保该过程既高效又用户友好。无论是传统的USB连接还是无线替代方案,我们都将探索分步说明,使您能够轻松......
  • Linux中关于useradd、chmod、chown、getfacl、setfact等权限设置
    文章目录一、Linux用户管理1、用户(user)、用户组(group)、其他用户概念(other)1.1理解Linux的`单用户多任务`,`多用户多任务`概念1.2用户(user)和用户组(group)概念;查看主机名和修改主机名需要root权限(然后输入密码)2.1创建用户2.1.1用adduser创建用户3、删除用户查看用户列......