
数据结构-AC自动机
JeraKrs
本人目前就职于百度商业研发部,有需要内推的朋友简历可发我邮箱 jerakrs@qq.com
展开
-
uva 1076 - Password Suspects(AC自动机+记忆化搜索)
题目链接:uva 1076 - Password Suspects题目大意:有一个长度为n的密码,存在m个子串,问说有多少种字符串满足,如果满足个数不大于42,按照字典序输出。解题思路:根据子串构建AC自动机,然后记忆化搜索,dp[i][u][s]表示第i个字符,在u节点,匹配s个子串。#include #include #include #include #inclu原创 2014-09-05 22:29:56 · 4040 阅读 · 2 评论 -
zoj 3228 Searching the String(AC自动机)
题目连接:zoj 3228 Searching the String题目大意:给定一个字符串,然后现在有N次询问,每次有一个type和一个子串,问说子串在字符串中出现几次,type为0时为可重叠,为1时为不可重叠。解题思路:不过没有type=1的限制,那么就是普通的AC自动机匹配问题,对于不可重叠问题,可以对于每个节点记录一下上一次匹配到的pos,用当前匹配的i减掉原创 2014-11-10 20:46:43 · 1092 阅读 · 0 评论 -
poj 1699 Best Sequence(AC自动机+状压DP)
题目链接:poj 1699 Best Sequence题目大意;给定N个DNA序列,问说最少多长的字符串包含所有序列。解题思路:AC自动机+状压DP,先对字符串构造AC自动机,然后在dp[s][i]表示匹配了s,移动到节点i时候的最短步数。#include #include #include #include #include #include using nam原创 2014-11-11 21:38:20 · 1419 阅读 · 0 评论 -
hdu 3341 Lost's revenge(AC自动机+变进制状压DP)
题目链接:hdu 3341 Lost's revenge题目大意:给定一些需要匹配的串,然后在给定一个目标串,现在可以通过交换目标串中任意两个位置的字符,要求最后生成的串匹配尽量多的匹配串,可以重复匹配。解题思路:这题很明显是AC自动机+DP,但是dp的状态需要开40∗40∗40∗40(记录每种字符的个数),空间承受不了,但是其实因为目标串的长度有限,为40;所以状原创 2014-11-11 23:10:46 · 1098 阅读 · 0 评论 -
hdu 2457 DNA repair(AC自动机+DP)
题目链接:hdu 2457 DNA repair题目大意:给定一些DNA序列,表示带有疾病,现在给定一个DNA序列,要求修改最少的位置,使得DNA不带有疾病的片段。解题思路:AC自动机+DP,先将DNA片段建立AC自动机,然后在AC自动机上进行dp,dp[i][j]表示长度为i移动到j节点修改了最少的步数。每次走到边如果和字符串不同,权值即为1;相同则为0。单词节点原创 2014-11-10 20:53:18 · 1024 阅读 · 0 评论 -
hdu 2296 Ring(AC自动机+DP)
题目链接:hdu 2296 Ring题目大意:给定N和M,表示要求一个长度不大于N的字符串,现在有M个得分串,给定M个得分串,以及每个串的得分值。要求分值尽量大,字符串尽量小,字典序尽量小。解题思路:AC自动机+DP,对得分串建立AC自动机,同样在自动机上DP,dp[i][j]表示长度i匹配到j节点的权值最大值,rec[i][j]则表示字典序最小的字符串,过程中既要原创 2014-11-10 20:59:03 · 1140 阅读 · 0 评论 -
hdu 3247 Resource Archiver(AC自动机+BFS+DP)
题目链接:hdu 3247 Resource Archiver题目大意:给定N个需要包含的串,M个不能包含的串,问说满足的最短字符串长度。解题思路:直接对所有串建立AC自动机,不能满足的串用同一种标记即可。然后处理出所有属于需要包含串的单词节点,用BFS处理出两两之间的距离,并且过程中是不能经过禁止节点。这样做的原因是节点的个数很多,如果对所有的节点进行dp的话空间原创 2014-11-11 22:32:13 · 1266 阅读 · 0 评论 -
hdu 1277 全文检索(AC自动机)
题目链接:hdu 1227 全文检索题目大意:略。解题思路:就是普通的匹配问题,注意相同串,以及输出要按照出现顺序呢。#include #include #include #include #include #include using namespace std;const int maxn = 10000 * 60;const int maxm = 10原创 2014-11-11 21:34:10 · 852 阅读 · 0 评论 -
hdu 3695 Computer Virus on Planet Pandora(AC自动机)
题目连接:hdu 3695 Computer Virus on Planet Pandora题目大意:给定一些病毒串,要求判断说给定串中包含几个病毒串,包括反转。解题思路:将给定的字符串展开,然后匹配一次后反转后再匹配一次。#include #include #include #include #include #include using namespace s原创 2014-11-12 23:46:02 · 1340 阅读 · 0 评论 -
zoj 3494 BCD Code(AC自动机+数位dp)
题目链接:zoj 3494 BCD Code题目大意:给定n个2进制串,然后有一个区间l,r,问说l,r之间有多少个数转换成BCD二进制后不包含上面的2进制串。解题思路:AC自动机+数位dp。先对禁止串建立AC自动机,所有的单词节点即为禁止通行的节点。接着进行数位dp,dp[i][j]表示第i为移动到节点j的可行方案数,每次枚举下一位数字,因为是BCD二进制,所以每位数要一原创 2014-11-13 20:23:18 · 1462 阅读 · 0 评论 -
hdu 5384 Danganronpa(AC自动机)
题目链接:hdu 5384 Danganronpa把B集合串建立自动机,然后A集合串一一去匹配即可。#include #include #include #include #include #include #include using namespace std;typedef long long ll;const int maxn = 1e5 + 5原创 2015-08-15 11:47:34 · 888 阅读 · 0 评论 -
poj 1625 Censored!(AC自动机+DP+高精度)
题目链接:poj 1625 Censored!题目大意:给定N,M,K,然后给定一个N字符的字符集和,现在要用这些字符组成一个长度为M的字符串,要求不包括K个子字符串。解题思路:AC自动机+DP+高精度。这题恶心的要死,给定的不能匹配字符串里面有负数的字符情况,也算是涨姿势了,对应每个字符固定偏移128单位。#include #include #includ原创 2014-11-09 23:08:27 · 928 阅读 · 0 评论 -
hdu 2825 Wireless Password(AC自动机+状压DP)
题目链接:hdu 2825 Wireless Password题目大意:N,M,K,M个字符串作为关键码集合,现在要求长度为N,包含K个以上的关键码的字符串有多少个。解题思路:AC自动机+dp,滚动数组,因为关键码个数不会超过10个,所以我们用二进制数表示匹配的状态。dp[i][j][k]表示到第i个位置,j节点,匹配k个字符串。#include #include原创 2014-11-09 23:14:13 · 959 阅读 · 0 评论 -
uva 1449 - Dominating Patterns(AC自动机)
题目练级:uva 1449 - Dominating Patterns题目大意:有一个由小写字母组成的字符串集和一个文本T,要求找出那些字符串在文本中出现的次数最多。解题思路:将字符串集建立AC自动机,然后传入T进行匹配,对每个匹配上的字符串多应次数加1,最后找出最大值。出现次数与最大值相同的字符串输出。注意字符集中出现相同字符的情况。#include #include #原创 2014-08-28 21:19:29 · 1146 阅读 · 0 评论 -
uva 11468 - Substring(AC自动机+概率)
题目链接:uva 11468 - Substring题目大意:给出一些字符和各自字符对应的选择概率,随机选择L次后得到一个长度为L的字符串,要求该字符串不包含任意一个子串的概率。解题思路:构造AC自动机之后,每随机生成一个字母,等于是在AC自动机上走一步,所有子串的结束位置的节点标记为禁止通行,然后问题转换成记忆搜索处理。#include #include #include原创 2014-08-28 21:29:25 · 1105 阅读 · 0 评论 -
uva 11019 - Matrix Matcher(AC自动机)
题目链接:uva 11019 - Matrix Matcher题目大意:给出一个n∗m的字符矩阵T,要求找出给定r∗c的字符矩阵P在T中出现的次数。解题思路:对P矩阵中的每一行做一个字符串,形成一个字符串集合。构建AC自动机,然后对T矩阵中的每一行进行一次查找,对应出现在该字符串中的子串对应位置+1,如果有一个位置上r次匹配,那么就存在一个匹配矩阵。#include #inc原创 2014-08-28 21:41:14 · 1591 阅读 · 0 评论 -
uva 1399 - Puzzle(AC自动机)
题目链接:uva 1399 - Puzzle题目大意:给定K和N,表示有K种不同的字符,N个禁止串,求一个最长的串使得该串不包含任何禁止串为子串。如果存在循环或者不能构成的话,输出No。解题思路:建立AC自动机,然后在AC自动机上做dp,所有单词结尾节点为禁止点。#include #include #include #include using namespace s原创 2014-09-01 22:17:34 · 1255 阅读 · 0 评论 -
hdu 3065 病毒侵袭持续中(AC自动机)
题目链接:hdu 3065 病毒侵袭持续中题目大意:略。解题思路:先建立AC自动机,然后在AC自动机中开一个数组,用来记录说每个不读特征码出现的次数。#include #include #include #include #include #include using namespace std;typedef long long ll;const int原创 2014-11-08 23:18:54 · 881 阅读 · 0 评论 -
hdu 2243 考研路茫茫——单词情结(AC自动机+矩阵快速幂)
题目链接:hdu 2243 考研路茫茫——单词情结题目大意:略。解题思路:和poj 2778 DNA Sequence类似的做法,不同的是这道题目是要求小于长度L的,所以要多加一个维护总和,做过矩阵快速幂的人肯定都会这个。然后我们肯定是先算出不包含词根的,用总的减掉就是要求的答案,所以我又加了两个用来维护总的,长度为i时,总的可能串有26i,累加。题目要求取模264原创 2014-11-09 11:16:06 · 1381 阅读 · 0 评论 -
hdu 2896 病毒侵袭(AC自动机)
题目链接:hdu 2896 病毒侵袭题目大意:略。解题思路:建立AC自动机,普通匹配操作。#include #include #include #include #include #include using namespace std;const int maxn = 100005;const int sigma_size = 128;struct A原创 2014-11-08 23:24:22 · 730 阅读 · 0 评论 -
hdu 2222 Keywords Search(AC自动机)
题目链接:hdu 2222 Keywords Search题目大意:给出个字符集,表示关键字,现在有一个字符串,问说匹配了多少个关键字。解题思路:AC自动机,注意有相同的关键字,同一个关键字出现两次算一个。#include #include #include #include #include using namespace std;const int maxn原创 2014-11-07 17:15:18 · 769 阅读 · 0 评论 -
poj 2778 DNA Sequence(AC自动机+矩阵快速幂)
题目链接:poj 2778 DNA Sequence题目大意:给定一些含有疾病的DNA序列,现在给定DNA长度,问有多少种不同的DNA序列是健康的。解题思路:对DNA片段建立AC自动机,因为最多10个串,每个串最长为10,所以最多可能有100个节点,在长度为n时以每个节点终止的健康字符串个数形成一个状态集,通过AC自动机形成的边可以推导出n+1的状态集,走到单词节点是原创 2014-11-08 23:37:59 · 1807 阅读 · 0 评论 -
zoj 3430 Detect the Virus(AC自动机)
题目连接:zoj 3430 Detect the Virus题目大意:给定一个编码完的串,将每一个字符对应着表的数值转换成6位二进制,然后以8为一个数值,重新形成字符串,判断给定询问串是否含有字符集中的串。解题思路:主要是题意,逆编码部分注意,转换完了之后,可能有字符'\0',所以不能用字符串的形式储存,要用int型的数组。注意有相同串的可能。#include原创 2014-11-08 23:30:08 · 1234 阅读 · 0 评论 -
hdu 4787 GRE Words Revenge(AC自动机)
题目链接:hdu 4787 GRE Words Revenge代码#include #include #include #include #include #include #include using namespace std;const int maxn = 1e5 + 5;const int sigma_size = 2;struct Aho_Coras原创 2015-10-27 20:05:09 · 669 阅读 · 0 评论