GT考试
看这篇题解
解释一下
首先是状态的定义,具体来说,\(f[i][j]\)应该表示考虑了准考证前\(i\)位,准考证的后\(j\)位与不吉利数字最多匹配的位数为\(j\),且整个准考证号不包含不吉利数字的方案数
这个最多匹配的意思:比如不吉利数字是\(1212\),准考证号是\(551212\),那么这就是\(f[6][4]\)的一个元素,而不是\(f[6][2]\)的一个元素
所以不难知道,答案就是\(\sum_{i=0}^{m-1}f[n][i]\)
考虑转移,一个很大的误区就是前\(i\)位的后缀匹配了\(j\)位,那么前\(i-1\)位的后缀就一定匹配了\(j-1\)位。比如一种情况,前\(i-1\)位匹配了\(k\)位(\(k>j-1\)),但是加上一个字符之后没办法匹配\(k+1\)位,然而却可以匹配\(j\)位
所以我们要处理\(g\)数组,表示当前后缀的匹配长度为\(k\),加上多少种字符之后匹配长度变成\(j\)
就是这个DP状态比较新,可以记住
update 2024.9.14
重新做一遍,想到了这个状态了,因为这种状态在字符串匹配DP里面的确已经比较常见了
然后却没有想到用KMP的情况导致错误了
这道题目的思路还是利用计数DP的第一种方法,将状态设置出来;只不过\(n\)太大了需要用矩阵快速幂加速而已(复习一下,不要认为\(n\)太大就怯于列方程,完全是可以利用矩阵乘法加速的)