http://blog.csdn.net/kk303/article/details/6929641 http://blog.csdn.net/human_ck/article/details/6577142 建立AC自动机以后,把所有单词结点标记出来,不要忘记,如果某个结点虽然原本不是单词结点,但其fail指针指向了一个单词结点,那么其也需要被标记为单词结点. 然后对于每个空的儿子本来应该在Trie上跳跃,但是我们可以直接让空的儿子指向其父的fail的那个对应的儿子,就没必要跳了,这样可以不用…
$给定 n 个模式串,和一个长度为 m 的原串 s,求至少修改原串中的几个字符可以使得原串中不包含任一个模式串.模式串总长度 ≤ 1000,m ≤ 1000.$ 先建出模式串的AC自动机,然后考虑怎么求最优解.考虑AC自动机上DP,设$f_{i,j}$走了$i$步之后在$j$节点时候的最少修改次数. 标记处所有不能走到的点(即走到就匹配了的点,即后缀为某一模式串的所有点),走点的时候应当回避这些点,转移的时候向合法的状态转移,分两种. 一种沿着原串$s_i$走,$f_{i+1,to_j}\lef…
建立AC自动机,把AC自动机当做一张图,在上面跑L个节点就行了. 参考了刘汝佳的代码,发现可能有一个潜在的Bug--如果模式串中出现了没有指定的字符,AC自动机可能会建立出错. 提供一组关于这个BUG的数据: 这组数据我觉得答案应该是1吧,无论如何组合'a'和'b'这两个字符,也无法得到模式串"ac"和"bd"!! AC代码 #include <stdio.h> #include <string.h> #include <queue&g…
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1030 题意概括 给出n个模式串,问长度为m的串中有多少个至少含有这n个模式串中的任意一个. 注意,所有的串仅由A~Z 26个大写字母构成. 题解 AC自动机好题. 先构建一个AC自动机. 然后在AC自动机上面跑dp. 建议开滚动数组. dp[i][j]表示长度为i,在AC自动机上面走到了j的方案数. 每次把所有走到模式串尾的全动统计到答案并清零. 代码 #include <cstring> #…
[BZOJ1030][JSOI2007]文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固定且完全随机的文章—— 也就是说,生成的文章中每个字节都是完全随机的.如果一篇文章中至少包含使用者们了解的一个单词,那么我们说这篇文章是可读的(我们称文章a包含单词b,当且仅当单词b是文章a的子串).但是,即使按照这样的标准,使用者现…
传送门 默认大家都学过trie与AC自动机. 先求出fail,对于每个节点维护一个sum,sum[u]待表从根到u所形成的字符串能拿到几分.显然sum[u]=sum[fail] + (u是几个字符串的结尾). 设dp[i][j]代表长度为i到trie树上的j号节点所得的最大分数,显然有dp[i+1][j的字符k儿子] = max{dp[i+1][j的字符k儿子], dp[i][j] + sum[j的字符k儿子]} memset(dp, -, sizeof(dp)); dp[][] = ; ; i…
题目链接 题目大意:给定$n$个子串,要求构造一个长度为$m$的母串使得至少有一个子串是其子串.问方案数. ------------------------ 我们可以对要求进行转化:求出不合法的方案数,总方案数减去不合法的方案数即为合法方案数. 首先建一个AC自动机,对于每个串的末尾结点及其$fail$边指向的结点都打上标记,表示遍历AC自动机的时候不经过这些点(因为如果一个串是另一个串的后缀,显然这两个串都是合法的). 然后就可以大力DP了.设$f[i][j]$表示走了$i$步到达$j$结点的…
给定N个长度不超过20的模式串,再给定一个长度为M的目标串S,求在目标串S上最少改变多少字符,可以使得它不包含任何的模式串 建立Trie图,求得每个节点是否是不可被包含的串,然后进行DP dp[i][j]表示在Trie图上行走i步到达节点j的要修改的最小次数,则 dp[i + 1][chi[j][k]] = min(dp[i + 1][chi[j][k]], dp[i][j] + (ACGT[k] != str[i])) chi[j][k]表示节点j的第k个子节点 #include<cstdio…
考虑对一个串如何分割能取得最大值.那么这是一个经典的线段覆盖问题,显然每次取右端点尽量靠前的串.于是可以把串放在AC自动机上跑,找到一个合法串后就记录并跳到根. 然后考虑dp.设f[i][j]表示前i位走到AC自动机上j节点的概率,枚举下个字符即可转移.同时记录此时期望伤害,找到合法串就统计入答案. 并且注意到每次转移是相同的.矩阵快速幂优化即可. 以及非常卡精度,需要全程long double.cout的保留小数位数误差是相当大的,必须用printf.并且转移到某个字符的概率即1/alphab…
AC自动机 转载自:小白 还可参考:飘过的小牛 1.KMP算法: a. 传统字符串的匹配和KMP: 对于字符串S = ”abcabcabdabba”,T = ”abcabd”,如果用T去匹配S下划线部分是当前已经匹配好的前缀,当c和d不匹配时: S:abcabcabdabba            T:abcabd 传统的算法是将T串向后移动一个单位,然后重新匹配.如果利用KMP算法则直接将T向后移动3位,即: S:abcabcabdabba            T:       abcabd…