AC 自动机优化

AC 自动机优化

今天来小谈一下AC自动机的优化。

1:在 trie 树中被搜过的点不用再搜第二遍,标记一下,因为答案已经统计入答案中。

2:有点类似路径压缩的感觉。

1 if (int y=e[x].nxt[i])
2             {
3                 e[e[x].nxt[i]].fail=e[e[x].fail].nxt[i];
4                 q[++tail]=y;
5             }
6             else e[x].nxt[i]=e[e[x].fail].nxt[i];

如果  nxt  数组为空,则 假设个虚拟节点,然后将它连入下一个  fail  当中 。实现了路径压缩(因为之后如果 nxt 数组不为空,就不用判断节点是否为空,直接开做,因为连的 fail 一定是有值的)

这里还蛮像 并查集的路径压缩 的,觉得难理解的思考思考这个。

原文地址:https://www.cnblogs.com/Frank-King/p/9643314.html

时间: 2024-10-07 05:31:48

AC 自动机优化的相关文章

【uva11019-Matrix Matcher】AC自动机+优化+记录

http://acm.hust.edu.cn/vjudge/problem/33057 题意:在二维文本串T中查找一个二维模板串P出现了多少次. 题解: 拆分模板串P的每一行,建AC自动机.拆分文本串T的每一行,在自动机中与P匹配,ct[i][j]表示以点(i,j)为左上角.与P等大的矩形有多少个对应的行与P匹配.最后ct[i][j]==P的行数的i,j就是一个匹配点,ans++.注意:1.原本我在trie的叶子用动态数组维护了一个表示这一行是P的第几行的数组,但是超时了,后来看了LRJ的代码,

[BZOJ 1009] [HNOI2008] GT考试 【AC自动机 + 矩阵乘法优化DP】

题目链接:BZOJ - 1009 题目分析 题目要求求出不包含给定字符串的长度为 n 的字符串的数量. 既然这样,应该就是 KMP + DP ,用 f[i][j] 表示长度为 i ,匹配到模式串第 j 位的字符串个数,然后转移就是可以从第 j 位加上一个字符转移到另一个位置. 然而..我并没有写过KMP + DP,我觉得还是写AC自动机+DP比较简单..于是,尽管只有一个模式串,我还是写了AC自动机+DP. 然后就是建出AC自动机,f[i][j] 表示长度为 i ,走到节点 j 的字符串的个数.

AC自动机 + 矩阵优化 --- [BJOI2017]魔法咒语

bzoj 4860   LOJ2180   洛谷P3175 [BJOI2017]魔法咒语 题目描述: Chandra 是一个魔法天才. 从一岁时接受火之教会洗礼之后,Chandra 就显示出对火元素无与伦比的亲和力,轻而易举地学会种种晦涩难解的法术. 这也多亏 Chandra 有着常人难以企及的语言天赋,让她能轻松流利地说出咒语中那些极其拗口的魔法词汇. 直到十四岁,开始学习威力强大的禁咒法术时,Chandra 才遇到了障碍. 根据火之魔法规则,禁咒的构成单位是 N 个基本词汇. 施法时只要凝聚

AC自动机 + 矩阵优化 + 期望 --- [BJOI2011]禁忌

bzoj 2553 [BJOI2011]禁忌 题目描述: Magic Land上的人们总是提起那个传说:他们的祖先John在那个东方岛屿帮助Koishi与其姐姐Satori最终战平.而后,Koishi恢复了读心的能力-- 如今,在John已经成为传说的时代,再次造访那座岛屿的人们却发现Koishi遇到了新麻烦. 这次她遇到了Flandre Scarlet--她拥有可以使用禁忌魔法而不会受到伤害的能力. 为了说明什么是禁忌魔法及其伤害,引入以下概念: 1.字母集A上的每个非空字符串对应了一个魔法.

Kattis - nvwls (AC自动机last优化 + dp)

题意 给出一个字典,每个单词去掉元音字母 A.E.I.O.U 之后形成一个新字典. 先给出一个只有辅音组成的串,用原字典中的单词还原该串,若存在多种还原方式,输出还原后元音字母数量最多的那种,若依旧多种,则任意输出. 传送门 思路 ac自动机fail树上跑dp的一眼套路题. 总结一下遇到的坑: 多个单词去掉元音字母之后形成的新单词相同. 若原单词只有辅音字母. dp过程中未保证完全还原辅音串. 特殊样例将 跳fail的过程卡成了 \(n^2\) . 解决办法: 在字典树的结尾节点保存编号时,保存

【uva1502/hdu4117-GRE Words】DP+线段树优化+AC自动机

这题我的代码在hdu上AC,在uva上WA. 题意:按顺序输入n个串以及它的权值di,要求在其中选取一些串,前一个必须是后一个的子串.问d值的和最大是多少. (1≤n≤2×10^4 ,串的总长度<=3*10^5) 题解: 这题一开始我的方向就错了,想了很久d[x][y]表示在AC自动机上的节点x.下一个串要大于y的dp.然而这样做数组要10^4*10^5=10^9级别,开都开不了,妥妥超时. 后来看了一眼题解...觉得自己智商真是感人... 用f[i]表示以第i个串为结尾的时候最大的d值,这样做

[POJ2778]DNA Sequence(AC自动机 + DP + 矩阵优化)

传送门 AC自动机加DP就不说了 注意到 m <= 10,所以模式串很少. 而 n 很大就需要 log 的算法,很容易想到矩阵. 但是该怎么构建? 还是矩阵 A(i,j) = ∑A(i,k) * A(k,j),那么i到j的方案数就是j到k的方案数称k到j的方案数,那么直接矩阵快速幂即可 #include <queue> #include <cstdio> #include <cstring> #define N 100001 #define p 100000 #d

poj2778--DNA Sequence(AC自动机+矩阵优化)

DNA Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12252   Accepted: 4661 Description It's well known that DNA Sequence is a sequence only contains A, C, T and G, and it's very useful to analyze a segment of DNA Sequence,For ex

HDU 2825 Wireless Password AC自动机+dp

训练赛第二场的I题,上完体育课回来就把这题过了,今天训练赛rank1了,还把大大队虐了,而且我还过了这道题 (虽然我也就过了这道题...),第一次在比赛中手写AC自动机还带dp的,心情大好. 给一个字符串集合,求包含该集合超过K个字符的,长度为L的字符串的个数. 显然是在AC自动机上跑dp,设dp[u][L][k]表示当前在结点u,还要走L步,当前状态为k的个数.一开始第三维表示的是包含k个字符串,但是题目要求不含重复的,那就只能状压了.转移为dp[u][L][k]+=dp[v][L-1][nk