自动机dp
文章平均质量分 86
alpc_qleonardo
这个作者很懒,什么都没留下…
展开
-
CodeChef FAVNUM FavouriteNumbers(AC自动机+数位dp+二分答案)
好久没有写数位dp了,着实快忘记怎么写了…… 大致题意是,给你一些幸运数字,然后问你在一个区间内的第k大的,含有幸运数字的数是哪一个数字。 其实做法也很简单,这种类型的题目一看就知道是数位dp,然后求第k大,肯定是二分枚举这个数字,然后每次数位dp计算小于等于这个数字的范围内有多少个数字满足条件。关键就在于如何判定这个数字是否包含了幸运数字。而AC自动机正好可以解决这个问题,我们把所有的幸运数字加入到AC自动机中,然后我们同样在AC自动机上面dp。dp[len][pos]原创 2018-02-26 15:20:18 · 302 阅读 · 0 评论 -
POJ 1625 Censored!(AC自动机+dp+高精度)
大致题意,给你n个字符,和一个长度m,所有的单词都由m个这些字符构成,于是总的单词数目为n^m。然后再给你一些单词(长度不一定是m),所有包含这些单词的单词都不算是合法的单词,现在问你总共有多少个合法的单词。 这种题目用dp的话还是挺明显的,但是普通的dp并不能够判断是否已经构成了合法单词,缺少判断的手段。于是只能借助于AC自动机。我们把所有给出的不合法单词构造AC自动机,当然要注意的是,对于fail指针,我们得做出一些修改。在Trie中,如果一个节点x无法到达字母a,但是它的fail能够到原创 2018-02-18 11:08:39 · 496 阅读 · 0 评论 -
POJ 2778 DNA Sequence(AC自动机+矩阵快速幂+dp)
大致题意,与之前那道题目差不多,也是由指定的一些字母构成的字符串,不能够包换一些不合法的字符,再告诉你一个长度,问你一共有多少个合法的字符串。但不同的是,这道题目的长度可以很长。 上一道题目,我们介绍了用dp的方法去解决,但是这题面对这么长的长度,显然是不可取的。但是我们回顾一下上一道题目dp的过程,dp[i][j]表示到达AC自动机上的j点走了i步时的方案数,最后要求的是 Σdp[n][j],即到达每个合法点走了n步时的方案数总和。而在图论中,邻接矩阵的乘法、次方,恰好可以表示一个人在图中原创 2018-02-20 10:02:42 · 347 阅读 · 0 评论 -
HDU 4057 Rescue the Rabbit(AC自动机+状态压缩dp)
大致题意,还是类似,给你一些字符串,这些字符串有相应的权值,只要包含某个字符串就要加上这个权值。然后同样也是A、T、C和G四个DNA,再告诉你一个长度,问你这个长度的所有字符串中,权值和最大能够到达多少。 一开始的想法还是和之前类似,我们之前有记录单词结尾,我们现在在记录单词结尾的时候把单词的权值也给记上,然后转移的时候,转移最大值。有转移方程dp[i][j]=max(dp[i][j],dp[i-1][x]+val[x]),这个val[x]包含的不止一个单词的结尾的权值,因为单词有相互包含的原创 2018-02-21 12:02:40 · 291 阅读 · 0 评论 -
HDU 3247 Resource Archiver(AC自动机+状态压缩dp+最短路BFS)
大致题意:给你一些合法字符串,和一些不合法串,现在要求你构造一个字符串,使得这个字符串包含所有哦的合法串,且不包含任何不合法串,而且长度最短。 这里了涉及到一个长度最短,可能就和之前的一些题目不同。我们注意到这个数据范围,合法串只有最多10个,所以状态压缩dp很容易想到。这里是求字符最短长度,如果把长度看做代价,很容易发现,此题和状态压缩的鼻祖 HDU 4568 很像。这题是要求你在一个矩阵中取10个以内的东西,每次走一步,问你最少需要走多少步能够取完所有的东西。今天这题则是构造字符串,要求原创 2018-02-25 10:00:29 · 379 阅读 · 0 评论 -
CodeForces 932G Palindrome Partition(回文自动机 + dp)
大致题意:给你一个字符串,让你把它分为k个部分,k为偶数。设这k个部分分别表示为s1,s2,...,sk,问使得对于每一个i都满足的划分方法有多少种,也即使得这k个部分构成回文的方法有多少种。 由于是回文,我们当然要想办法往回文上面去靠。根据题意有 我们假设第一段长度为j,令 有 如果我们把排列方式换一下,令 我们可以发现,S'恰好是一个回文串。 那么我们推广一下,我...原创 2019-02-27 23:52:30 · 541 阅读 · 0 评论 -
HDU 4878 ZCC loves words(AC自动机 + dp + 矩阵快速幂 + 中国剩余定理)
大致题意:给你一些匹配串和一个很长的长度L。让你计算所有长度为L的小写字母构成的字符串的得分总和对5047621取模后的数值。这里,每个字符串s的得分定义为,若s的子串s[i..j]等于第k个匹配串,那么产生p[k]*(len[k]+j)的得分,最后的得分为每一次得分的积。 由于涉及到匹配的问题,所以很自然的可以想到用上AC自动机。我们考虑AC自动机上的dp,我们令dp[l]...原创 2019-02-18 22:58:22 · 348 阅读 · 0 评论