题意:给定不超过50个由 ‘A’, ‘G’ , ‘C‘ ,’T’。 四个字母组成的模式串,每个模式串长度不超过 20,再给一个不超过1000个字符长的同样由上述字母组成的母串S, 问在S中至少要修改多 少个字符,才能使其不包含任何模式串。
思路:对模式串建立AC自动机。然后在其上进行动态规划。Ans[i][j]表示若要用长度为i的母串的前缀遍历DFA树, 使之达到节点 j ,至少要修改的字符数量。j 必须不是模式串的“危险”节点。
初始情况:Ans[0][1] = 0 //1是DFA的初始节点其他所有Ans[i][j] 为无穷大。
问题的答案就是Min{ Ans[len][j] | j 是DFA的安全节点 ,其中len是母串的长度}
状态转移方程为:由Ans[i][j] 可以推出:Ans[i+1][son[j]] = min { Ans[i+1][son[j]],Ans[i][j] + ( Char(j,son[j]) != str[i] ) }。Char(j,son[j])表示从节点j走到节点son[j]所经过的字母,str是母串,下标从0开始算。
#include
#include
#include
#include