热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Trie图(AC自动机)总结

AC自动机构建完成后,某个节点沿着Fail链向上能从长到短走到自己的所有后缀。一般的,遍历主串进行匹配,就是在Trie图上定向移动的过程。

AC自动机构建完成后,某个节点沿着Fail链向上能从长到短走到自己的所有后缀。一般的,遍历主串进行匹配,就是在Trie图上定向移动的过程。

构造(一遍 BFS)

1 void build_AC()
2 {
3 int u=0;
4 for(int i&#61;0;i<26;i&#43;&#43;)
5 if(ch[u][i])q[r&#43;&#43;]&#61;ch[u][i];
6 while(l<r)
7 {
8 u&#61;q[l&#43;&#43;];
9 for(int i&#61;0;i<26;i&#43;&#43;)
10 if(ch[u][i])
11 {
12 fail[ch[u][i]]&#61;ch[fail[u]][i];
13 flag[ch[u][i]]|&#61;flag[fail[ch[u][i]]];
14 q[r&#43;&#43;]&#61;ch[u][i];
15 }
16 else
17 ch[u][i]&#61;ch[fail[u]][i];
18 }
19 }

1、模式匹配

主串从左到右&#xff0c;就顺着每一个字符向下跳&#xff0c;每一次沿着Fail链向上。这样会可重而不漏的得到模式串中的所有子串&#xff0c;视题目要求进行操作即可。

&#xff08;1&#xff09;TJOI2013 单词&#xff1a;本人的LJ做法&#xff0c;把所有串建Trie图&#xff0c;再把所有串拿 # 接起来&#xff0c;然后暴力匹配。

2、利用Fail链进行预处理

&#xff08;1&#xff09;不可到达&#xff08;危险&#xff09;节点标记&#xff1a;一个串的后缀是危险的&#xff0c;它即是危险的

&#xff08;2&#xff09;某些统计&#xff1a;到达某个串结尾处相当于匹配了它和它的所有后缀&#xff0c;可以进行一些sigma之类的操作

3、与Trie图性质相关

&#xff08;SDOI2005 病毒&#xff09;模拟一个字符串在Trie图上匹配的过程&#xff0c;危险节点不可走。在此基础上找环。

4、AC自动机相关某些题目

&#xff08;1&#xff09;HNOI2004 L语言 &#xff1a;在模式串结尾记LEN&#xff0c;一边模式匹配一边 DP&#xff0c;F[i]|&#61;F[i-len[j]]

&#xff08;2&#xff09;USACO2015 删减&#xff1a;在模式串结尾记LEN&#xff0c;维护一个栈&#xff0c;匹配成功时把栈顶上LEN个元素拿走

&#xff08;3&#xff09;JSOI2009&#xff1a;密码&#xff1a;在Trie图上进行记忆化搜索&#xff08;记录所有串的选取状态&#xff09;输出方案好恶心的

5、Trie图上的DP

一般的&#xff0c;设出如下状态&#xff1a;

F[i][j]&#xff1a;做到主串第i个位置&#xff0c;在Trie图上的j点&#xff0c;……&#xff1a;做到主串第 i 个位置&#xff0c;在Trie图上的 j 点&#xff0c;……。

转移&#xff1a;F[i][j] --> F[i&#43;1][k] (k\epsilon Child[j]) 使用刷表法DP&#xff0c;必要时上矩阵进行优化。

初始状态是 F[0][0]

&#xff08;1&#xff09;Fzoj DNA修复&#xff1a;不能往危险节点跑&#xff0c;然后直接F[0][0]&#61;0,F[i&#43;1][k]&#61;min\left \{ F[i][j]&#43;(S[i&#43;1]!&#61;Choose) \right \}

&#xff08;2&#xff09;Fzoj 匹配&#xff1a;状压&#xff0c;F[i&#43;1][k][S|Flag[k]]&#43;&#61;F[i][j][S]&#xff0c;Flag事先预处理。

&#xff08;3&#xff09;Fzoj 中等的字符串&#xff1a;F[i&#43;1][k]&#61;max\left \{ F[i][j] &#43;w[k] \right \}&#xff0c; 构造矩阵转移&#xff0c;类似求 N 条边最长路。

扔一份 暴力DP 的代码&#xff1a;

1 void dp()
2 {
3 for(int i&#61;0;i<&#61;n;i&#43;&#43;)
4 for(int j&#61;0;j<&#61;tot;j&#43;&#43;)
5 f[i][j]&#61;-inf;
6 f[0][0]&#61;0;
7 for(int i&#61;0;i)
8 for(int j&#61;0;j<&#61;tot;j&#43;&#43;)
9 if(f[i][j]>&#61;0)
10 for(int x&#61;0;x<26;x&#43;&#43;)
11 {
12 int k&#61;ch[j][x];
13 f[i&#43;1][k]&#61;max(f[i&#43;1][k],f[i][j]&#43;num[k]);
14 }
15 }

&#xff08;4&#xff09;BJOI2016 打字机&#xff1a;不可做

&#xff08;5&#xff09;BJOI2017 魔法咒语&#xff1a;1-6号点暴力做&#xff0c;7-8用转移矩阵&#xff0c;9-10类似 Fib 那样进行转移&#xff0c;挺毒瘤的。

6、Fail树性质&#xff08;Fail 链自下而上的后缀关系&#xff09;

一般用于解决与多串相关的子串计数问题。

&#xff08;1&#xff09;阿狸的打字机&#xff1a;按题意模拟建 Trie 树&#xff0c;按题意模拟在 Trie 图上跑&#xff0c;走到&#43;1离开-1&#xff0c;用 BIT 维护子树和。

&#xff08;2&#xff09;COCI2015 Divljak&#xff1a;先对 Alice 的串建 Trie 图&#xff0c;由 Fail 树性质原问题等价于解决“树链求并”的计数问题&#xff0c;解决方法我是抄题解的&#xff1a;对链的各个底端端点按 dfs 序排序&#xff0c;在各个点处 &#43;1&#xff0c;在相邻两点 LCA 处 -1&#xff08;想一想为啥&#xff09;。树剖求 LCA 即可。子树和仍然使用 BIT 维护。

转:https://www.cnblogs.com/bestwyj/p/10152184.html



推荐阅读
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了求解gcdexgcd斐蜀定理的迭代法和递归法,并解释了exgcd的概念和应用。exgcd是指对于不完全为0的非负整数a和b,gcd(a,b)表示a和b的最大公约数,必然存在整数对x和y,使得gcd(a,b)=ax+by。此外,本文还给出了相应的代码示例。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了开关稳压器设计中PCB布局布线的重要性,并提供了相应的准则。开关稳压器作为一种高效的电源,逐渐取代了线性稳压器。开关模式电源的工作原理是通过一定的开启时间和关闭时间来实现电压转换。开关频率并不是影响系统的最大因素,而开关转换的速度才是关键。在系统噪声方面,开关频率或其谐波可能会对系统产生影响。严格遵守PCB布局布线的准则,可以将开关模式电源的相关问题降到最小。 ... [详细]
author-avatar
行者师兄2502861743
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有