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

AC 自动机

时间:2022-12-01 11:23:23浏览次数:58  
标签:AC 子树 fail 自动机 节点 DP

AC 自动机是更高维的 kmp。构造方法感觉更像是运用了 dp 的思想,先对所有模式串建立一棵 Trie 树,然后考虑某个节点 \(x\),有个 \(w\) 的后缀,考虑如何去求它的 fail 值。于是就有了 AC 自动机的核心代码:

int x=q.front(),ff=t[x].fail;q.pop();
for(int i=0;i<26;i++)
	if(t[x].nxt[i])t[t[x].nxt[i]].fail=t[ff].nxt[i],q.push(t[x].nxt[i]);
	else t[x].nxt[i]=t[ff].nxt[i];

单纯匹配的题有 第一块板子

比较无脑的就是可以在 AC 自动机上 DP,和在 kmp 自动机上 DP 是同一个道理。P4052 是板子,套路是以当前匹配到的位置 \(x\) 作为状态进行转移,决策就是下一个字符放啥,然后正常转移即可,在这道题中的限制就是不能转移到有 end 的节点,把这些点忽略即可。显然它是可以用矩阵来描画的,P3041 是矩阵快速幂优化 DP 套 AC 自动机,缝合题。P7456 不能算是 AC 自动机上 DP,而只能算是帮助 DP,不知道应该归到哪里。

一般的题目都会用到 fail 树的性质。自动机上每个点往 fail 对应的点上连边,显然最后会形成一棵树(每个点只会往更浅的点连接)。有一个显然的性质是,对于一个节点 \(x\),它到根的路径可以看成是 kmp 的一个匹配过程,所以实际上这些点的串都是 \(x\) 串的后缀,这就非常有用了。在 第二块板子 中,我们现在停留在 \(x\),那么实际上达到的效果是点到根所有点对应的串都出现了一次,然而暴力去找显然是不行的。于是可以找每个点出现的次数,然后回答的时候可以看成是一次子树求和(因为子树内的值会对它产生贡献)。P3966 也是一个意思。

fail 树也是树,所以可以树剖,这牵扯到一个性质。首先根据字典树的原理,一个节点在字典树上到根的所有节点形成了它的前缀集合,而一个串在另一个中出现可以看成前者是后者前缀的后缀。而前面也说了,\(A\) 是 \(B\) 后缀表现为在 fail 树上 \(B\) 是 \(A\) 子树中的节点,所以要统计一个串在另一个串中出现了几次,就只需要把后者到根(字典树上)的所有点标记一下,然后查找前者子树中有多少个标记节点即可,用树状数组可以维护。P2414 就是这个方法,一个结论是说对于题目中所言的过程,虽然串的总长度可能很大,但建出来的 Trie 树不会太大(甚至可以边输入边建树)。把所有 \(y\) 离线下来排序之后按顺序回答就可以保证修改的次数是线性的,这样一来就可以用上面那种方法了,复杂度有一只 log。CF163E 会更简单一些,当前匹配到的点的贡献是 fail 树上点到根的权值之和,所以说修改操作就是单点修改,询问就是链查询,转化成子树修改单点查询即可,树状数组维护,一只 log。

标签:AC,子树,fail,自动机,节点,DP
From: https://www.cnblogs.com/Feyn/p/16940850.html

相关文章

  • Oracle中ALTER TABLE的五种用法(四、五)
    首发微信公众号:SQL数据库运维原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1&sn=450e9e94fa709b5eeff0de371c62072b&chksm=ea37536cdd......
  • cloud 若依微服务框架中fallback的意思
    若依中代码:  这里的fallbackFactory:工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码fallbackFactory=RemoteUse......
  • Mac 安装php7.2+和composer
    安装php7.2+操作步骤安装HomeBrew/bin/zsh-c"$(curl-fsSLhttps://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"使用Brew安装Phpbrewinstallphp@......
  • IntelliJ IDEA For Mac-快捷键
    Mac键盘符号和修饰键说明⌘ Command⇧ Shift⌥ Option⌃ Control↩︎ Return/Enter⌫ Delete⌦ 向前删除键(Fn+Delete)↑ 上箭头↓ 下箭头← 左箭头→ ......
  • mac sublime text3-快捷键
    cmd+n新建页面cmd+数字键切换到对应页面cmd+p搜索跳转到对应页cmd+w关闭页面cmd+j合并一行cmd+d选中当前单词,继续敲可以选中多个cmd+l选中当前行cmd+z撤销......
  • .Net【Winform】BackgroudWorker总结
    BackgroundWorkerWinfrom程序经常会有一些后台耗时操作,例如批量处理,如果在主UI线程上执行,UI线程会卡死,用户的使用感觉会很差。而BackgroundWorker提供了执行异步操作,配合......
  • React Webpack copy文件到build路径
    目的:webpack打包时将资源文件copy到指定路径1:安装依赖copy-webpack-plugin、customize-cra、react-app-rewired2:修改script,使用react-app-rewired命令"build:copy":"......
  • Oracle常用的创建表语句
    Oracle常用的创建表语句Oracle常用的创建表语句指定字段的创建--指定字段的创建createtabletable_name(test_1(字段名1)varchar2(50),(类型)test_2(字段名2)in......
  • KingbaseES数据库通过dblink访问Oracle数据库
    本文介绍如KingbaseES数据库通过dblink访问Oracle数据库。源端:KingbaseES数据库(KingbaseESV008R006C006B0021)目标端:Oracle数据库一、配置Oracle的ODBC1、安装odbc,若有......
  • 吴恩达出品《Machine Learning Yearning》完整中文版
    编者荐语 《MachineLearningYearning》是吴恩达历时两年,根据自己多年实践经验整理出来的一本机器学习、深度学习实践经验宝典。作为一本AI实战圣经,本书主要教你如何在......