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插入 ...
随机推荐
- java基础(十一)之抽象类和抽象函数
1.抽象函数的语法特征2.抽象类的语法特征3.抽象类的作用 抽象函数 只有函数的定义,没有函数体的函数被称为抽象函数: abstract void func(); 抽象类 使用abstract定义的类 ...
- Django数据迁移时(或者新建模型时)报错:Did you install mysqlclient,解决后又报错:mysqlclient 1.3.13 or newer is required;you have 0.9.3
报错信息如下: 解决方法一: 给项目根目录下mysite应用下的__init__.py文件加入如下代码: 运行又报错: 报错信息是: mysqlclient版本太低 点击上图框中的链接进入到pyth ...
- codeforces 711 D.Directed Roads(tarjan 强连通分量 )
题目链接:http://codeforces.com/contest/711/problem/D 题目大意:Udayland有一些小镇,小镇和小镇之间连接着路,在某些区域内,如果从小镇Ai开始,找到一 ...
- [爬坑日记] 安卓模拟器1903蓝屏 没开hyper-v
先说解决方案: 我在升级完1903之后短短几个小时蓝屏了两次 还是不同原因,不由得开始怀疑这个版本的稳定性,随后发现只有启动安卓模拟器的时候必然蓝屏(还有一次蓝屏实在安装驱动的时候) 经过百度得知需要 ...
- Mac电脑安装openresty
安装brew 软件仓库, /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/ ...
- 压缩/批量压缩/合并js文件
写在前面 如果文件少的话,直接去网站转化一下就行. http://tool.oschina.net/jscompress?type=3 1.压缩单个js文件 cnpm install uglify-j ...
- Linux 内核内存池
内核中经常进行内存的分配和释放.为了便于数据的频繁分配和回收,通常建立一个空闲链表——内存池.当不使用的已分配的内存时,将其放入内存池中,而不是直接释放掉. Linux内核提供了slab层来管理内存的 ...
- Java的JAVA_HOME、Path、CLASSPATH环境变量小结,可以借助这三个的配置去理解Oracle中的那几个环境变量的配置作用
问题:在哪里都能执行java命令,是和JAVA_HOME变量有关系呢还是path中指定的那个java路径呢?? 刚学Java的时候,很多jdk配置教程都要求设置JAVA_HOME.Path.CLASS ...
- jinja 语法 - 整型转字符串
大多数 jinja 相关的问题,其实查文档就解决了,但后来遇到这个问题,使得我把 jinja 官方文档,api.样例等,认真读了个遍= =. 发现没有直接的办法可以将整型转为字符串,对于需要进行字符串 ...
- 201771010135 杨蓉庆/张燕《面对对象程序设计(java)》第十三周学习总结
1.实验目的与要求 (1) 掌握事件处理的基本原理,理解其用途: (2) 掌握AWT事件模型的工作机制: (3) 掌握事件处理的基本编程模型: (4) 了解GUI界面组件观感设置方法: (5) 掌握W ...