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自动机)总结的更多相关文章

  1. BZOJ 1444 [JSOI2009]有趣的游戏 (Trie图/AC自动机+矩阵求逆)

    题目大意:给你$N$个长度相等且互不相同的模式串,现在有一个字符串生成器会不断生成字符,其中每个字符出现的概率是$p_{i}/q_{i}$,当生成器生成的字符串包含了某个模式串,则拥有该模式串的玩家胜 ...

  2. 1036 : Trie图 (AC自动机)

    题目大意: 输入 n 个目标单词和一个文本串,判断文本串中是否存在某些目标单词. 思路 赤裸裸的 AC自动机. 代码: #include<iostream> #include<cst ...

  3. BZOJ 3530 [SDOI2014]数数 (Trie图/AC自动机+数位DP)

    题目大意:略 裸的AC自动机+数位DP吧... 定义f[i][x][0/1]表示已经匹配到了第i位,当前位置是x,0表示没到上限,1到上限,此时数是数量 然而会出现虚拟前导零,即前几位没有数字的情况, ...

  4. hihoCoder 1036 Trie图 AC自动机

    题意:给定n个模式串和一个文本串,判断文本中是否存在模式串. 思路:套模板即可. AC代码 #include <cstdio> #include <cmath> #includ ...

  5. 关于Trie KMP AC自动机

    个人认为trie,KMP,AC自动机是思想非常明确的,AC自动机的性质是与KMP算法的思想类似的(失配后跳转) 而KMP是线性的,AC自动机是在tire树上跑KMP,为方便那些不会用指针的小朋友(我也 ...

  6. 2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机)

    2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机) https://www.luogu.com.cn/problem/P2292 题意: 标点符号的出现晚于文字的出 ...

  7. CF1110H Modest Substrings AC自动机、DP

    传送门 如果\(r-l\)比较小,可以将所有满足条件的串扔进\(AC\)自动机然后在上面DP,从前往后确定字符串的每一位. 但是\(l,r \leq 10^{800}\)就十分不可行,所以需要优化这个 ...

  8. HDU 3341 Lost's revenge ( Trie图 && 状压DP && 数量限制类型 )

    题意 : 给出 n 个模式串,最后给出一个主串,问你主串打乱重组的情况下,最多能够包含多少个模式串. 分析 : 如果你做过类似 Trie图 || AC自动机 + DP 类似的题目的话,那么这道题相对之 ...

  9. 模板—trie图

    做了某题之后发现trie的AC自动机太垃圾了,动不动就TLE,然后我就去学了trie图. #include<iostream> #include<cstdio> using n ...

  10. BZOJ 1009 GT考试(ac自动机+矩阵DP)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1009 题意:给定一个长度为m的串s.有多少种长度为n的串不包含s? 思路:(1)将s插入 ...

随机推荐

  1. docker-api的使用(java)

    通过docker-api来执行docker相关的操作.   配置 可以在docker启动文件docker.service中加入如下 vi /lib/systemd/system/docker.serv ...

  2. 001.Django_Model.整理

    Django001_Model.整理 Model表设计 数据定义数据存储,输出 a.定义表(信息 =字段) + 定义表关系 + (定义/限制)数据 b.通过orm等方法来,定义method来编辑原始数 ...

  3. 【SIKI学院】愤怒的小鸟创建过程-2

    第二讲:Spring joint组建介绍 点重小鸟右侧add component输入spring joint,选择spring joint 2D(弹簧关节).给右侧树枝加刚体选择physics 2D- ...

  4. tomcat查看当前内存

    查看运行中的tomcat内存非常简单,只需运行一下此界面就可以看到. <html> <head><meta http-equiv="Content-Type&q ...

  5. React的React.createContext()源码解析(四)

    一.产生context原因 从父组件直接传值到孙子组件,而不必一层一层的通过props进行传值,相比较以前的那种传值更加的方便.简介. 二.context的两种实现方式 1.老版本(React16.x ...

  6. Python 多任务(进程) day1(1)

    进程和程序的关系: 通俗来讲程序是死的不变的,进程是活的改变的.一个程序在没运行之前是程序,运行之后是进程 程序是一种电脑能识别的2进制代码,当你一直运行程序的时候,会出现多个进程(相当于菜谱和菜,照 ...

  7. 【C语言】一元二次方程(求实根和虚根)

    求一元二次方程:ax2+bx+c=0 的根. 输入三个实数a,b,c的值,且a不等于0. #include<stdio.h> #include<math.h> int main ...

  8. 自定义控件之绘图篇(四):canvas变换与操作

    具体操作见下面链接: http://blog.csdn.net/harvic880925/article/details/39080931/

  9. docker镜像拉取速度过慢的解决

    前提是我们在linux环境下安装好了docker,并且可以正常启动关闭. 当我们对镜像进行拉取的时候,会发现速度非常的慢,停在下面这个界面很久也不动. 解决方法 进入阿里云官网,进入后搜索docker ...

  10. C#面向对象三大特性:继承

    什么是继承 定义:继承是面向对象编程语言中的一个重要特性,当一个类A能够获取另一个类B中所有非私有的数据和操作的定义作为自己的部分或全部成分时,就称这两个类之间具有继承关系.被继承的类B称为父类或基类 ...