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

AC自动机

时间:2022-11-08 13:33:31浏览次数:60  
标签:AC 匹配 tr fail 自动机 节点 dp

\(tr[i].end\) 为 \(1\) 时表示为该节点为串尾。

\(tr[i].sum\) 表示以该点为串尾的字符串数。


普通自动机

P3121 [USACO15FEB]Censoring G

考虑对模式串建出自动机,在串尾打 tag ,在文本串上跑自动机,开一个栈维护当前位跑到自动机上的节点编号,一个栈维护剩余的字符,当跑到串尾时,弹出该串所有的字符,挂在自动机上的指针回退到该串入栈之前。


对 fail 树的操作 + DS 维护

P2292 [HNOI2004] L 语言

考虑建出该字典图的 fail 树,考虑 fail 树的性质。由于串长不超过 \(20\), 在每一个节点维护一个状压集合 \(S\) 表示从根到该节点的所有串能匹配的长度,考虑边 \(u->v\),下传时显然有 \(S_v~|=S_u\),特殊的,若该节点本身是串尾,则 \(S_u~|=(1<<dep_u)\) 。

考虑依旧使用状压来匹配,在字典树上跑当前的文本串,记录跑到的节点到根节点中的串尾的长度,也能用状压维护,最后把两个值与起来不为 \(0\) 就能计入答案了。

P2444 [POI2000]病毒

首先将病毒代码段插入自动机,建出 fail 指针,显然如果能在不走串尾的情况下在字典图上经过一个环则有解,这一过程可以通过 dfs 实现。

考虑一个自动机常见优化,当一个节点的 fail 指针如果指向串尾,则其一定不能走。

CF163E

考虑自动机的匹配问题,可以枚举匹配到的文本串末端,求出其在自动机上的节点编号后在 fail 树上用 DS 维护,由于 fail 树上根到节点路径上所有字符串都为枚举字符串的后缀,所以不重不漏。

考虑本题,建出自动机后,建出 fail 树,由于 fail 树上 \(u->v\) 路径表示 \(u\) 的字符串为 \(v\) 的字符串的后缀,说明新增一个模式串,在 fail 树上以其为根的子树一定能新增贡献,删除同理。查询只需要像上文一样,枚举末端,然后单点查询就可以了。

于是只需要用 \(dfs\) 序转序列问题后维护一个支持单点查询,区间修改的数据结构即可。

CF1437G

套路的建出 fail 树,由于修改权值,我们不能将 fail 树上以其为根的子树全部修改,因为其他串可以被权值更大的子串所覆盖,所以我们考虑转成单点修改权值。

查询的话同理,我们枚举末端,求出节点编号为 \(u\),考虑到根到 \(u\) 上的路径全为子串,我们只需要求路径最值即可,可以用树剖来维护。


自动机 + DP

在自动机上的 DP 十分套路,一般设 \(dp[i][j]\) 表示跑到自动机上的节点 \(i\),并且当前匹配到文本串第 \(j\) 位的答案。

P4052 [JSOI2007]文本生成器

正难则反,考虑完全不可读的文章数,则答案为 \(26^m-ans~\)。

有一个显然的结论是匹配到的点能计入答案当且仅当其不是串尾,于是可以直接用来做转移的条件。

记 \(dp[u][j]\) 表示跑到自动机第 \(u\) 个点,匹配到第 \(j\) 位的方案数。

初始值 \(dp[0][0]=1\)

当转移后的节点不为串尾时有转移方程 \(dp[tr[u].ch[i]][j+1]+=dp[u][j]\) 。

P3041 [USACO12JAN]Video Game G

套路的,我们设 \(dp[u][j]\) 表示跑到自动机第 \(u\) 个点,匹配到第 \(j\) 位的方案数。

特殊的,我们在求 fail 指针时,以 \(u\) 为结尾的贡献要加上 \(tr[u].fail\) 的贡献,因为根到 \(fail\) 的路径组成的字符串为根到 \(u\) 路径组成字符串的一个后缀,当加入节点 \(u\) 时,后缀同样能累计贡献。

初始值 \(dp[u][j]=-INF\)

转移方程会比较简单:

\(dp[tr[u].ch[i]][j+1]=\max(dp[tr[u].ch[i]][j+1],dp[u][j]+tr[tr[u].ch[i]].sum)\)

标签:AC,匹配,tr,fail,自动机,节点,dp
From: https://www.cnblogs.com/tidongCrazy/p/16867021.html

相关文章

  • 2022-11-08 Acwing每日一题
    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我......
  • Oracle、MySQL等数据库故障处理优质文章分享 | 10月汇总
    墨天轮社区于9月起持续举办【聊聊故障处理那些事儿】DBA专题征文活动,每月进行评优发奖,鼓励大家记录工作中遇到的数据库故障处理过程,不仅用于自我复盘与分析,同时也能帮助其......
  • React核心工作原理
    ##1.1、虚拟DOM常见问题:reactvirtualdom是什么?说一下diff算法?拿到一个问题,一般回答都是是什么?为什么?怎么办?那就按照这个思路来吧!what用JavaScript对象表示DOM......
  • React性能优化的8种方式
    一引沿Fiber架构是React16中引入的新概念,目的就是解决大型React应用卡顿,React在遍历更新每一个节点的时候都不是用的真实DOM,都是采用虚拟DOM,所以可以理解成fiber就是R......
  • Nacos 认证绕过漏洞(CVE-2021-29441)
    Nacos认证绕过漏洞(CVE-2021-29441)产生原因:1.认证授权操作时,会判断请求的user-agent是否为”Nacos-Server”,如果是的话则不进行任何认证。2.开发者原意是用来处理一些服......
  • windows下anaconda安装
    本来安装了miniconda,但是发现打开PowerShell后指令前没有(base),就卸载了,打算安装anaconda。关于anaconda与python版本对应问题安装anaconda后,其会在他的环境之下安装对应......
  • 界面组件Kendo UI for React R3 2022新版,让Web应用更酷炫
    KendoUI致力于新的开发,来满足不断变化的需求,通过React框架的KendoUIJavaScript封装来支持ReactJavascript框架。KendoUIforReact能够为客户提供更好的用户体验,并且......
  • React组件设计模式-纯组件,函数组件,高阶组件
    一、组件(1)函数组件如果你想写的组件只包含一个render方法,并且不包含state,那么使用函数组件就会更简单。我们不需要定义一个继承于React.Component的类,我们可以定......
  • 基于 React 和 Redux 的 API 集成解决方案
    在前端开发的过程中,我们可能会花不少的时间去集成API、与API联调、或者解决API变动带来的问题。如果你也希望减轻这部分负担,提高团队的开发效率,那么这篇文章一定会对你......
  • 10个值得你去试试的React开发工具
    JavaScript每天都在出现大量的框架和工具,而React是除了上次我们提到的Vue和Ember之外另一款比较流行的框架。但因为新的工具每天都在不断的出现,开发者在尝试时总会有些不知......