Trie图(AC自动机)总结
AC自动机构建完成后,某个节点沿着Fail链向上能从长到短走到自己的所有后缀。一般的,遍历主串进行匹配,就是在Trie图上定向移动的过程。
构造(一遍 BFS)
void build_AC()
{
int u=;
for(int i=;i<;i++)
if(ch[u][i])q[r++]=ch[u][i];
while(l<r)
{
u=q[l++];
for(int i=;i<;i++)
if(ch[u][i])
{
fail[ch[u][i]]=ch[fail[u]][i];
flag[ch[u][i]]|=flag[fail[ch[u][i]]];
q[r++]=ch[u][i];
}
else
ch[u][i]=ch[fail[u]][i];
}
}
1、模式匹配
主串从左到右,就顺着每一个字符向下跳,每一次沿着Fail链向上。这样会可重而不漏的得到模式串中的所有子串,视题目要求进行操作即可。
(1)TJOI2013 单词:本人的LJ做法,把所有串建Trie图,再把所有串拿 # 接起来,然后暴力匹配。
2、利用Fail链进行预处理
(1)不可到达(危险)节点标记:一个串的后缀是危险的,它即是危险的
(2)某些统计:到达某个串结尾处相当于匹配了它和它的所有后缀,可以进行一些sigma之类的操作
3、与Trie图性质相关
(SDOI2005 病毒)模拟一个字符串在Trie图上匹配的过程,危险节点不可走。在此基础上找环。
4、AC自动机相关某些题目
(1)HNOI2004 L语言 :在模式串结尾记LEN,一边模式匹配一边 DP,
(2)USACO2015 删减:在模式串结尾记LEN,维护一个栈,匹配成功时把栈顶上LEN个元素拿走
(3)JSOI2009:密码:在Trie图上进行记忆化搜索(记录所有串的选取状态)输出方案好恶心的
5、Trie图上的DP
一般的,设出如下状态:
:做到主串第 i 个位置,在Trie图上的 j 点,……。
转移: 使用刷表法DP,必要时上矩阵进行优化。
初始状态是 。
(1)Fzoj DNA修复:不能往危险节点跑,然后直接。
(2)Fzoj 匹配:状压,,Flag事先预处理。
(3)Fzoj 中等的字符串:, 构造矩阵转移,类似求 N 条边最长路。
扔一份 暴力DP 的代码:
void dp()
{
for(int i=;i<=n;i++)
for(int j=;j<=tot;j++)
f[i][j]=-inf;
f[][]=;
for(int i=;i<n;i++)
for(int j=;j<=tot;j++)
if(f[i][j]>=)
for(int x=;x<;x++)
{
int k=ch[j][x];
f[i+][k]=max(f[i+][k],f[i][j]+num[k]);
}
}
(4)BJOI2016 打字机:不可做
(5)BJOI2017 魔法咒语:1-6号点暴力做,7-8用转移矩阵,9-10类似 Fib 那样进行转移,挺毒瘤的。
6、Fail树性质(Fail 链自下而上的后缀关系)
一般用于解决与多串相关的子串计数问题。
(1)阿狸的打字机:按题意模拟建 Trie 树,按题意模拟在 Trie 图上跑,走到+1离开-1,用 BIT 维护子树和。
(2)COCI2015 Divljak:先对 Alice 的串建 Trie 图,由 Fail 树性质原问题等价于解决“树链求并”的计数问题,解决方法我是抄题解的:对链的各个底端端点按 dfs 序排序,在各个点处 +1,在相邻两点 LCA 处 -1(想一想为啥)。树剖求 LCA 即可。子树和仍然使用 BIT 维护。
Trie图(AC自动机)总结的更多相关文章
- BZOJ 1444 [JSOI2009]有趣的游戏 (Trie图/AC自动机+矩阵求逆)
题目大意:给你$N$个长度相等且互不相同的模式串,现在有一个字符串生成器会不断生成字符,其中每个字符出现的概率是$p_{i}/q_{i}$,当生成器生成的字符串包含了某个模式串,则拥有该模式串的玩家胜 ...
- 1036 : Trie图 (AC自动机)
题目大意: 输入 n 个目标单词和一个文本串,判断文本串中是否存在某些目标单词. 思路 赤裸裸的 AC自动机. 代码: #include<iostream> #include<cst ...
- BZOJ 3530 [SDOI2014]数数 (Trie图/AC自动机+数位DP)
题目大意:略 裸的AC自动机+数位DP吧... 定义f[i][x][0/1]表示已经匹配到了第i位,当前位置是x,0表示没到上限,1到上限,此时数是数量 然而会出现虚拟前导零,即前几位没有数字的情况, ...
- hihoCoder 1036 Trie图 AC自动机
题意:给定n个模式串和一个文本串,判断文本中是否存在模式串. 思路:套模板即可. AC代码 #include <cstdio> #include <cmath> #includ ...
- 关于Trie KMP AC自动机
个人认为trie,KMP,AC自动机是思想非常明确的,AC自动机的性质是与KMP算法的思想类似的(失配后跳转) 而KMP是线性的,AC自动机是在tire树上跑KMP,为方便那些不会用指针的小朋友(我也 ...
- 2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机)
2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机) https://www.luogu.com.cn/problem/P2292 题意: 标点符号的出现晚于文字的出 ...
- CF1110H Modest Substrings AC自动机、DP
传送门 如果\(r-l\)比较小,可以将所有满足条件的串扔进\(AC\)自动机然后在上面DP,从前往后确定字符串的每一位. 但是\(l,r \leq 10^{800}\)就十分不可行,所以需要优化这个 ...
- HDU 3341 Lost's revenge ( Trie图 && 状压DP && 数量限制类型 )
题意 : 给出 n 个模式串,最后给出一个主串,问你主串打乱重组的情况下,最多能够包含多少个模式串. 分析 : 如果你做过类似 Trie图 || AC自动机 + DP 类似的题目的话,那么这道题相对之 ...
- 模板—trie图
做了某题之后发现trie的AC自动机太垃圾了,动不动就TLE,然后我就去学了trie图. #include<iostream> #include<cstdio> using n ...
- BZOJ 1009 GT考试(ac自动机+矩阵DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1009 题意:给定一个长度为m的串s.有多少种长度为n的串不包含s? 思路:(1)将s插入 ...
随机推荐
- MFC程序使用控制台打印
1.在OnCreate窗口创建方法中调用控制台窗口创建方法,创建的窗口是与MFC主窗口共存亡的 参考地址:https://blog.csdn.net/Yong_Qi2015/article/detai ...
- 第二十五篇 玩转数据结构——链表(Linked List)
1.. 链表的重要性 我们之前实现的动态数组.栈.队列,底层都是依托静态数组,靠resize来解决固定容量的问题,而"链表"则是一种真正的动态数据结构,不需要处理固定容 ...
- splay(1区间翻转区间最值与区间修改)
bzoj1251权限题 题目点这里,你懂得 直接上板子,这个要好好体会 操作是最经典的. #include <algorithm> #include <iostream> #i ...
- AcWing 850. Dijkstra求最短路 II 堆优化版 优先队列 稀疏图
//稀疏图 点和边差不多 #include <cstring> #include <iostream> #include <algorithm> #include ...
- 7-3 Path to Infinity(还没ac)
留坑 #include<bits/stdc++.h> using namespace std; ; ; typedef long long ll; string s,t; ,tol2=,t ...
- 寒假安卓app开发学习记录(1)
今天是安卓软件开发的第一天.虽然之前有了对javaweb的学习,但是对基于安卓的软件开发还是一无所知.所以,第一步就是寻找学习资源,从慕课网上还有菜鸟教程上都找到了对应的教程.然后就开始了开发的第一步 ...
- Spring - MVC - thymeleaf 缓存关闭
1. 概述 spring 配合 thymeleaf 关闭页面缓存 2. 背景 最近复习 spring 找了本书叫 spring in action 5th 本人水平有限 书还写得那么难 调试中遇到了问 ...
- Go流程结构(for)
一.程序的流程结构 程序的流程控制结构一共有三种:顺序结构,选择结构,循环结构. 顺序结构:代码从上向下逐行的执行 选择结构:条件满足,某些代码才会被执行.0-1次 if语句,switch语句 循环结 ...
- ALSA driver基本概念
https://blog.csdn.net/zyuanyun/article/details/59180272#t6 1.Card For each soundcard, a “card” recor ...
- Linux上临时路由、永久路由配置
Linux下查看路由条目 查看路由表命令 route -n 示例 [root@cobbler_vm ~]# route -n Kernel IP routing table Destination G ...