热门标签 | 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



推荐阅读
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • Python自动化测试入门:Selenium环境搭建
    本文详细介绍如何在Python环境中安装和配置Selenium,包括开发工具PyCharm的安装、Python环境的设置以及Selenium包的安装方法。此外,还提供了编写和运行第一个自动化测试脚本的步骤。 ... [详细]
  • 搭建Jenkins、Ant与TestNG集成环境
    本文详细介绍了如何在Ubuntu 16.04系统上配置Jenkins、Ant和TestNG的集成开发环境,涵盖从安装到配置的具体步骤,并提供了创建Windows Slave节点及项目构建的指南。 ... [详细]
  • 精致小屏灰色风格苹果CMS v10模板,支持DIY主题管理系统
    探索一款专为影视站设计的苹果CMS v10模板,具备强大的主题管理系统和500多个设置项,无需二次开发即可轻松配置。下载地址:https://www.mytheme.cn/maccms/244.html,演示地址:http://demo.mytheme.cn/index.php?id=244。 ... [详细]
  • ABBYY FineReader:高效PDF转换、精准OCR识别与文档对比工具
    在处理PDF转换和OCR识别时,您是否遇到过格式混乱、识别率低或图表无法正常识别的问题?ABBYY FineReader以其强大的功能和高精度的识别技术,完美解决这些问题,帮助您轻松找到最终版文档。 ... [详细]
  • Python 工具推荐 | PyHubWeekly 第二十一期:提升命令行体验的五大工具
    本期 PyHubWeekly 为大家精选了 GitHub 上五个优秀的 Python 工具,涵盖金融数据可视化、终端美化、国际化支持、图像增强和远程 Shell 环境配置。欢迎关注并参与项目。 ... [详细]
  • Vue 开发与调试工具指南
    本文介绍了如何使用 Vue 调试工具,包括克隆仓库、安装依赖包、构建项目以及在 Chrome 浏览器中加载扩展的详细步骤。 ... [详细]
  • Python3 中使用 lxml 模块解析 XPath 数据详解
    XPath 是一种用于在 XML 文档中查找信息的路径语言,同样适用于 HTML 文件的搜索。本文将详细介绍如何利用 Python 的 lxml 模块通过 XPath 技术高效地解析和抓取网页数据。 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 解决TensorFlow CPU版本安装中的依赖问题
    本文记录了在安装CPU版本的TensorFlow过程中遇到的依赖问题及解决方案,特别是numpy版本不匹配和动态链接库(DLL)错误。通过详细的步骤说明和专业建议,帮助读者顺利安装并使用TensorFlow。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 深入理解ExtJS:从入门到精通
    本文详细介绍了ExtJS的功能及其在大型企业前端开发中的应用。通过实例和详细的文件结构解析,帮助初学者快速掌握ExtJS的核心概念,并提供实用技巧和最佳实践。 ... [详细]
  • HTML基础入门指南
    本文将深入浅出地介绍HTML的基础知识,包括其定义、开发工具、制定机构、特性、基本标签及更多实用内容。 ... [详细]
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社区 版权所有