AC自动机
文章平均质量分 60
_kikyou-
这个作者很懒,什么都没留下…
展开
-
SOJ 4710 DINGDINGMEI WANT TO READ(ac自动机+滑动窗口)
测评姬传送门题意:分析:首先建ac自动机,由于模式串只有不超过20个,我们可以用压缩成二进制状态表示。(这样在查询的时候就可以避免跳fail了)我们利用滑动窗口的思想扫描主串进行匹配,匹配成功的标志就是相应二进制位是1。同时记录每个串最后一次的匹配位置。(匹配位置定义为首字符在主串中出现的位置。)主串每匹配一个位置就判断一下当前位置的左边窗口i-k+1是否≤ 所有模式串的匹配位置,是的话答案就+1#include<bits/stdc++.h>using namespace原创 2021-05-24 13:46:24 · 131 阅读 · 1 评论 -
Codeforces Round #305 (Div. 1)E. Mike and Friends(AC自动机+fail树dfs序+主席树)
传送门题意:给定n个字符串,q次询问,每次给出正整数L,R,X,要求输出第x个字符串在第l个字符串到第r个字符串的总匹配次数。(字符串长度之和不大于2e5)分析:首先我们考虑对于一个字符串集合,我们如何求出其中某个字符串在集合中的匹配次数?比如给定集合cacaa,baabaa,aa。求出aa在集合中的总匹配次数。(易知答案是4) 。 我们可以把所有的串插入AC自动机,再用aa去trie树上匹配,随后统计fail树上每个子树的点权和。 aa的尾节点的匹配次数就是答案了。 为什么呢?因为在fail树原创 2021-05-12 11:05:30 · 208 阅读 · 0 评论 -
P5357 【模板】AC自动机(拓扑排序优化查询 + fail树dfs优化查询 )
题目链接之前学AC自动机查找的过程都是暴力跳fail,但是遇到a,aa,aaa…这种,每次只能向上跳1层,时间复杂度就直接退化成|STR|N|S| 了,要不得。我们可以换一个思路,在建好AC自动机之后,当某个节点V被匹配1次,V的最长真后缀也会被匹配一次,即fail[V] 节点的答案+1 ,我们可以在查询的时候先只记录V被匹配的答案,然后把fail指针看成有向边进行tupo ,matchpfail[v]]+=match[v] 。tupo结束后,match数组就是每个模式串被匹配的次数。细节见代码注释原创 2021-04-01 15:03:43 · 387 阅读 · 0 评论 -
Resource Archiver HDU - 3247 (AC自动机+最短路+状压dp/dfs 或 AC自动机+bfs暴力)
题目链接 题意:给定n个文件串,m个病毒串,问能构造多短的字符串,满足包含了全部文件串,不含病毒串。 文件串长度之和<=1e4 病毒串长度之和<=5e4 ,1<=n<=10,1<=m<=1000思路:首先把文件串,病毒串建一个AC自动机,尾节点打好状态标记。之后有2种方法:········· 第一种是AC自动机上用状压dp(1<=n<=10), 但是如果直接令dp[i][j]表示转移到第i个节点,状态为j时的最短字符串的话,1<=i&原创 2020-08-25 23:16:44 · 362 阅读 · 0 评论 -
Lost‘s revenge HDU - 3341(AC自动机+状压dp)
题意:给出n个模式串,一个目标串,问把目标串重新排位最多能产生多少个模式串,可以重叠且所有串只包含A C G T。目标串长度不超过40思路:1、问题转化成,使用与目标串相同数目的A G C T字符排列组合,得到的字符串最多能包含多少个模式串。多模式匹配问题,建好AC自动机。2、目标串长度不多,联想到可以用类似 ”乌龟棋“这题类似的状压dp,把A G C T的使用数目情况看成一种状态,Hash[i][j][k][m]表示用了i个A j个G k个C m个T时的状态Hash从0开始赋值,于是每个状态就对应了一原创 2020-08-23 20:16:57 · 123 阅读 · 0 评论 -
Searching the String ZOJ - 3228 (AC自动机+思维)
题目链接题目大意:给定一个文本串,n个模式串,其中模式串有两种,一种是同一模式串可以有重合的部分,如ababa 出现两次aba,另一种是相同的模式串不允许重合,如ababa 出现1次aba.问所有的模式串各自在文本串中出现了多少次.思路:对于第一种,可以重合的模式串,就是朴素的ac自动机。对于第二种,相同模式串不能重合,我们可以知道,相同模式串有重合当且仅当第二次出现的位置-第一次出现的位置<字符串长度,我们可以开一个数组last[],last[i]记录以i号节点结尾的单词,最新匹配成功的位置原创 2020-08-23 13:50:13 · 927 阅读 · 0 评论 -
Ring HDU - 2296(AC自动机+dp)
题目链接题意:给你m个字符串,每个字符串有自己的价值,求一个长度不超过n的字符串,满足其包含的所有子串价值之和最大 。思路:套路有点明显,AC自动机+dpdp[i][j]表示走了i步,到达j节点时的最大价值, 则dp[i][j]=max(dp[i-1][father])+value[j]但是这题细节很多:一是关于建AC自动机时候字符串价值的预处理,二是dp过程的常数优化,三是当有多个最优解字符串的时候要求长度最小 且字典序最小的那个。 具体看代码注释了~#include<iostream&g原创 2020-08-21 17:48:13 · 171 阅读 · 0 评论 -
Wireless Password HDU - 2825(AC自动机+状压dp 卡常)
题目链接题意:给你M个word串,问你能构造多少种长度为N的字符串,满足至少包含K个不同的word串。 1<=N<=25 1<=M<=10 1<=K<=10思路:首先想到,建AC自动机,并且给每个插入的word串一个状态,1<<x x为插入的序号,即:isstr[1<<x] 就是第x个word串对应的二进制状态。(1 10 100 1000… )建好AC自动机后就是一个状态压缩dp的题,dp[i][j][k]表示目前走了i步,到原创 2020-08-21 00:24:44 · 193 阅读 · 0 评论 -
Censored! POJ - 1625(AC自动机 + dp +高精度模板)
题目链接题目大意:给你一个字母表,给定一些敏感字符串,问长度为m且不含任意敏感字符串的串有多少个。(字符全部来自字母表)思路:首先第一个坑点是输入的字符是unsigned char,可能出现负的ASCII码值,我的解决方法是整体加128。 此外,这题和POJ2778有点类似,不过POJ2778不需要用大整数,用矩阵快速幂可以过,但这题需要用高精度存答案,高精度+矩阵快速幂会tle。所以我们用动态规划,对建好的状态机进行状态转移(AC自动机建状态图的过程就不赘述了),令dp[i][j]为目前走了i步的原创 2020-08-19 19:08:48 · 180 阅读 · 0 评论 -
DNA Sequence POJ - 2778 小白详解(AC自动机+矩阵快速幂)
题目链接~题意:给定m(1<=m<=10)个字符串(仅含有A T C G,长度不超过10),和正整数n(1<=n<=2e9),问有多少种仅包含A T C G 的长度为n的字符串,满足不包含这m个字符串中的任意一个作为子串。•样例m=4,n=3,{“AA”,”AT”,”AC”,”AG”}•答案为36,表示有36种长度为3的序列可以不包含疾病思路:这题需要知道一个重要的知识,首先建ac自动机可以得到一个有向图,如图所示就是插入"ACG" 和”C"这连个字符串之后的trie图原创 2020-08-14 23:27:45 · 202 阅读 · 0 评论