Bzoj 1009
题意:给定$m$长值域$[0,9]$数列$A_i$,要求构造$n$长值域$[0,9]$数列$X_i$使得$A_i$不是$X_i$的子串,即$X_i$中不出现$A_i$,求方案数。$n \leq 10^9, m \leq 20$
类似CF 1096D,CF 1015F以及AC自动机的相关方法,我们这里可以定义$dp(i,j)$为构造串$X_i$前$i$个字符与$A_i$匹配了$j$位的方案数。最后答案即为$\sum_{i=0}^{m-1} dp(n,i)$,即不包含完全匹配的串的方案
转移方程为(刷表):
$$
dp(i+1,x)+=dp(i,j)
$$
$x$为在当前后面放一个$[0,9]$之间的数后匹配的影响,特别的,如果匹配了$m$位,以后转移都只能从$m$转移而来。这个$x$可用 $KMP$ 预处理。
这里$n \leq 10^9$ 显然矩阵优化,构造矩阵即可。
注意$j=0$处转移矩阵:$dp(i,0)$一定可以以某个$[0,9]$之间的数转移到$dp(i+1, 1)$,所以在矩阵中设$(0,1)=1$;
$dp(i,0)$一定可以有$9$种情况转移到$dp(i+1, 0)$,即仍然不匹配。所以在矩阵中设$(0,0)=1$
发现一个新的 $Debug$ 方法:过不去样例,可以测测自己写的小数据,这个数据可能非常小,如果程序都过不去的话,那么肯定这里都有问题。就能各个击破,发现 $Bug$。