
ACM-AC自动机
路小白_zZ
这个作者很懒,什么都没留下…
展开
-
zoj 3430(ac自动机)
题意:给出n个模式串,是以base64编码的,m个目标串,也是base64编码,问每个目标串里有多少种模式串。base64是把普通ASCII字符二进制表示的每6位截断对应一个最大编号到63的字符表可以对应一个字符,也就是每四个字符对应一个普通字符,不够就末尾补零。补两个0是”=”,补四个0是”==”。 题解:先把所有给出的串都先解码为普通的字符串,然后是自动机模板解法。#include <cstd原创 2015-10-01 19:03:35 · 554 阅读 · 0 评论 -
hdu 2296(ac自动机+dp)
题意:有m个模式串,且每个模式串有一个权值,求一个长度不超过n的目标串,权值最大,如果有多个解输出长度最短,长度都相同选字典序最小的。 题解:n最大50,可以dp,f[i][j]表示长度为i的字符串结尾字母是j的最大权值,s[i][j]表示长度为i结尾字母是j的最优字符串解。ac自动机可以得到模式串的跳转表next[node][c]和到节点i的权值val[i],那么状态转移方程可得:f[i][ne原创 2015-10-07 16:28:07 · 567 阅读 · 0 评论 -
zoj 3228(ac自动机)
题意:给出一个目标串,然后有n个询问,0 模式串 是询问模式串可重叠在目标串中出现了多少次,1 模式串 是询问模式串不可重叠在目标串中出现了多少次。 题解:可重叠的就是普通的模板题,不可重叠。不可重叠意味着每个匹配模式串的开头位置一定在上一个匹配结束位置之后,也就是 当前目标串位置 - 上一个匹配模式串的结束位置 >= 当前字符在模式串中的位置。trie树的val[i]数组就可以存i节点在模式串中原创 2015-10-09 15:43:52 · 409 阅读 · 0 评论 -
zoj 3494(ac自动机+数位dp)
题意:从0到9都用4位的二进制数表示,叫做BCD码,给出n个模式串,是不能出现的串,给出整数A和整数B,A <= B,问从A到B所有数字化为化成BCD码,问多少个数字的BCD码中没有任何模式串。 题解:0 <= A <= B <= 2^200,位数有200位,可以用数位dp来处理,先用自动机把所有模式串都存到trie图中,然后预处理出bcd[i][j]表示节点i添加的数字是j将会跳到的节点,在数位原创 2015-10-11 22:16:57 · 660 阅读 · 0 评论 -
poj 1625(ac自动机+dp+高精度)
题意:有p个模式串,长度为m的目标串中不出现模式串的种类是多少,且给出了字符串会出现的n个字母。 题解:由于串的长度最多到50,可以用dp,f[i][j]表示串长度为i结尾节点是j的路径数,状态转移方程f[i][j] = sum(f[i - 1][k]),串长度为i-1,结尾节点是k,且添加字符c后能安全跳到节点j的所有情况和。因为总种类最多有n^m,没有让取模,需要用高精度。#include <原创 2015-10-06 20:03:50 · 534 阅读 · 0 评论 -
hdu 3341(ac自动机+dp)
题意:给出一个n个模式串,一个目标串,问把目标串重新排位最多能产生多少个模式串,可以重叠且所有串只包含A C G T。 题解:先统计目标串里A C G T的个数,题目意思转化为用num[0]个A,num[1]个C,num[2]个G,num[3]个T组成的串最多包含多少个模式串。可以先建好trie图,根据trie图然后dp,重点在状态的转移,f[i][s],表示i节点状态是s的最优解,状态可以用ha原创 2015-10-09 20:54:56 · 1589 阅读 · 0 评论 -
hdu 3247(ac自动机+状态压缩dp+最短路)
题意:有n个源文件也就是n个字符串(n<=10 长度<=1000),m种病毒也同样是m个字符串(m<=1000,总长度50000),现在要问最短的串包含所有源文件但不存在一个子串是病毒的长度,源文件的串可以重叠存在,所有字符串由01组成。 题解:好题,思路来自这里http://m.blog.youkuaiyun.com/blog/woshi250hua/8021283 问题可以转化为找出一个最短的串,包含所原创 2015-10-10 13:33:57 · 564 阅读 · 0 评论 -
hdu 2222(ac自动机)
题意:给出n个模式串,一个目标串,问目标串里有多少个模式串。 题解:ac自动机模板题。#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int N = 500005;const int SIGMA_SIZE = 26;char str[100原创 2015-09-25 21:04:35 · 364 阅读 · 0 评论 -
poj 2778(ac自动机+矩阵快速幂)
题意:给出n个字符串(由字母A C G T组成),然后问一个长度为m的字符串(由字母A C G T组成)中不出现n个字符串中任意一个的种类是多少。 题解:因为m的范围是20000000000,要用到矩阵快速幂加速运算,邻接矩阵mat[i][j]表示从节点i到节点j走一步有多少种走法,那么mat[i][j]^n是n步可达矩阵,也就是从节点i到节点j走n步有多少种走法,这个步骤用矩阵快速幂,可以根据t原创 2015-10-06 00:32:19 · 790 阅读 · 0 评论 -
hdu 2243(ac自动机+矩阵快速幂)
题意:有n个小写字母组成的模式串,问长度不超过L的小写字母串中至少出现一个模式串的种类是多少。 题解:这道题和poj 2778类似,不过是把长度小于L的串的可能情况也计入,把邻接矩阵多一维存总和,然后结果用总种类数减一个模式串也不出现的种类数。总种类数很大,26^1 + 26^2 + 26^3 + … + 26^n,也用矩阵快速幂计算。f(n) = 26 * f(n - 1) + 26。 初始矩原创 2015-10-06 17:03:49 · 1475 阅读 · 0 评论 -
hdu 2825(ac自动机+状态压缩dp)
题意:有m个模式串,问长度为n的目标串中至少出现k种模式串的种类数,可以重叠且所有的串都只包含小写字母。 题解:因为模式串最多10个,可以用状态压缩来表示每一个模式串是否出现,f[i][j][k]是长度为i的字符串,结尾节点是j且当前所用模式串状态是k的所有可能情况。状态转移方程f[i][next[j][l]][k | val[next[j][l]] = sum{ f[i - 1][j][k] }原创 2015-10-06 21:25:24 · 640 阅读 · 0 评论 -
hdu 2457(ac自动机+dp)
题意:有n个模式串,一个目标串,问如果要修改目标串使目标串内没有模式串,问最少修改多少个字符。 题解:n最大50,字符只有4种,可以dp,f[i][j]表示前i个字符,当前节点是j最少修改多少个字符,那么状态转移的前提是跳转的节点不是trie树中非模式串结尾节点,那么如果当前跳转点不是目标串对应位置的点,f[i][next[j][k]] = min(f[i][next[j][k]], f[i -原创 2015-10-07 21:51:52 · 1283 阅读 · 0 评论 -
hdu 2896(ac自动机)
题意:给出n个模式串,然后m个目标串,问每个目标串里用了哪些模式串,一共有多少个目标串内存在模式串。 题解:如果当前字符是某个模式串的结尾字符,val[u]存模式串的编号,也算是个模板题。#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int原创 2015-09-25 23:34:27 · 411 阅读 · 0 评论