AC自动机
文章平均质量分 81
as604412059
这个作者很懒,什么都没留下…
展开
-
HDU2222Keywords Search
题意:给n1000000的模式串。 用模式串建立好自动机然后在模式串上搜索就好了 #include #include #include #include #include #include using namespace std; struct Tree { int next[500010][26],fail[500010],end[500010]; int root,L; int原创 2016-05-19 20:00:29 · 280 阅读 · 0 评论 -
HDU 3247 Resource Archiver
给n个源串和m个病毒串,求包含所有源串但不包含任何病毒串的串的最短长度。利用源串和病毒串建立自动机,当为源串时end记录下标,病毒串时end标记为-1,然后在跑bfs时如果当前节点的fail指向节点的end为-1时,当前节点也需标记为-1,否则end[p]|=end[fail[p]].然后用dp[i][j]跑状压dp,i表示当前包含串的状态,j为当前节点状态,然后还需用一个二维数组表示mark[i原创 2016-05-19 23:43:13 · 297 阅读 · 0 评论 -
HDU 3341 Lost's revenge
给定n个模式串和一个目标串,求将目标串重排列后所能包含的最多的模式串个数。可以开个dp[s][a][c][g][t]来记录状态转移,s为结点状态,但是a,c,g,t的值范围为[0,40],很明显数组爆了,于是有个很神奇的方法,可以利用状态压缩把状态压成最多11*11*11*11的大小来标记a,c,g,t. num[4]来记录a,c,g,t出现的次数。bits[4]代表对应的权值,那么bits[0]原创 2016-05-19 21:32:09 · 251 阅读 · 0 评论 -
ZOJ 3228 Searching the String
给定一个模式串和n个目标串和对应的权值,当为0时求目标串在模式串里的出现次数(可重叠),当为1是可重叠。主要还是利用fail指针进行判断,当可重叠时直接累加end数组就可,不可重叠时需记录当前串的长度l和之前匹配到的最大下标p,如果l+p #include #include #include #include #include using namespace std; const int I原创 2016-05-19 21:23:41 · 392 阅读 · 0 评论 -
HDU 2457 DNA repair
给定n个模式串,一个目标串,求目标串修改最少多少次可以使其不包含任何模式串。用二维dp来求,主要是要构建出DFA,具体看之前的的poj2778里的链接。然后就是判断转移时是否需要+1,和利用end数组判断当前是否可以转移。代码如下 #include #include #include #include #include using namespace std; const int INF=1原创 2016-05-19 21:17:37 · 307 阅读 · 0 评论 -
HDU 2296 Ring
给定m个模式串和对应的权值,求长度为n的包含总权值最大的目标串,如果有多个解输出最短的个,如果还有多个解输出字典序最小的个。end数组记录权值后用dp来跑,字符串处理会麻烦些,代码如下 #include #include #include #include #include using namespace std; const int INF=1e9; const int MOD=20090原创 2016-05-19 21:14:00 · 178 阅读 · 0 评论 -
HDU 2825 Wireless Password
给定m个模式串,求至少包含k个模式串长度为n的目标串的种数MOD20090717。end数组记录为模式串下标的二进制数,然后利用状态压缩dp来求解,dp[i][j][k],i为当前串长度,j为当前结点状态,s为包含串状态。最后答案为dp[n][i][j],i为枚举的所有结点,j为包含串转态大于等于k时的值,代码如下 #include #include #include #include #i原创 2016-05-19 21:00:44 · 224 阅读 · 0 评论 -
POJ 1625 Censored!
给定p个模式串,求长度为m,字符仅由给出的n个字符构成,用mp数组标记下。然后和之前的几道类似,利用end和next数组得到转态转移数组,然后由于题目数据不像之前的那么大,可以用dp[i][j]来进行状态转移,i代表当前串长度,j为当前状态。但是由于答案很大需要用到高精度。代码如下 #include #include #include #include #include using name原创 2016-05-19 20:48:27 · 302 阅读 · 0 评论 -
HDU 2243 考研路茫茫――单词情结
这道题和poj2778类似都需要利用end数组和next数组的特性构建状态数组,不过这里是需要经过至少一个目标串,而且长度是不小于L的,即需要长度为1~L时的种数和。然后我们可以求出总数后减去不经过目标串的和,剩下的就是我们要的答案。设总数的数组为f[n],当n为1时答案为26,n为2时为26+26^2,即f[n]=(f[n-1]+1)*26;由于n等于L小于2^31,所以一样用矩阵快速幂求出再减原创 2016-05-19 20:37:27 · 722 阅读 · 0 评论 -
POJ 2778 DNA Sequence
给m个长度不超过10的模式串,求长度为n小于200000000的不包含任意一个模式串的种数。 最开始最这道题的时候毫无头绪,最后看了这篇文章才理解了:(http://www.cnblogs.com/Booble/archive/2010/12/09/1901626.html),但是首先还要知道矩阵的一些应用:(http://www.matrix67.com/blog/archives/276)原创 2016-05-19 20:19:31 · 209 阅读 · 0 评论 -
HDU 3065 病毒侵袭持续中
和hdu2222类似,一样的开个数组标记下出现次数就好,代码如下 #include #include #include #include #include #include using namespace std; char a[1010][55]; struct Tree { int next[500010][128],fail[500010],end[500010]; int ro原创 2016-05-19 20:15:58 · 212 阅读 · 0 评论 -
HDU 2896 病毒侵袭
end数组记录下模式串下标传参需大于0因为同时也需要记录是否为尾串。然后建好自动机。在query操作时,开个数组标记下经过了哪些目标串,即mark下end数组。 代码如下 #include #include #include #include #include #include using namespace std; struct Tree { int next[500010][12原创 2016-05-19 20:09:41 · 201 阅读 · 0 评论 -
ZOJ 3494 BCD Code
数位DP+自动机的结合,到现在发现对于题目的算法而言,我们都能学会,但是欠缺的是需要一点点细化而成的一步步想法与算法相结合。 以后一定要静下心来一点点细化的想。 多的不说了,代码如下 #include #include #include #include #include using namespace std; const int INF=1e9; const int MOD=20090原创 2016-05-20 00:17:49 · 253 阅读 · 0 评论