Description
题目链接:BZOJ 1009
阿申准备报名参加 GT 考试,准考证号为 $n$ 位数 $X_1,X_2,\dots,X_n$,他不望准考证号上出现不吉利的数字。他的不吉利数学 $A_1,A_2,\dots,A_m$ 有 $m$ 位,不出现是指 $X_1,X_2,\dots,X_n$ 中没有恰好一段等于 $A_1,A_2,\dots,A_m$。注意 $A_1$ 和 $X_1$ 可以为 $0$。
数据范围:$1\le n\le 10^9$,$1\le m\le 20$,$1\le k\le 1000$,$0\le X_i,A_i\le 9$
Solution
我们定义 $\text{DP}$ 状态 $f_{i,j}$ 表示考虑到第 $i$ 个数,匹配到了 $X$ 中的第 $j$ 个字符时的方案数。显然 $i,j$ 的范围是 $0\le i\le n$,$0\le j<m$。
转移方程为:
其中的 $p$ 不一定是 $0$ 或者 $j-1$,因为加入字符 $k$ 后,有如下三种情况:
- 匹配到了 $X$ 中的下一个字符。
- 失配,无法匹配任何字符。
- 重新匹配到了 $X$ 的一个前缀。
这个式子看似无法优化了,我们换一种方式写出转移方程:
其中的 $g_{k,j}$ 表示一个匹配了长度为 $k$ 长度的串,有多少种加数字的方法,使得匹配长度变成 $j$。
由于我们知道原串,那么 $g_{i,j}$ 是固定的,我们可以预处理出这个数组。我们可以使用 $\text{KMP}$ 算法,求出 $\text{next}$ 数组后,枚举匹配长度 $k$ 和字符 $ch$,暴力计算能匹配到多长的前缀。
这样一来,我们得到了一个 $O(nm^2)$ 的算法。
再次观察这个 $\text{DP}$ 式子,可以轻松发现这个式子和矩阵乘法的式子非常相似,那么我们用矩阵快速幂优化 $\text{DP}$ 转移即可,求出 $g$ 矩阵的 $n$ 次幂。
时间复杂度:$O(m^3\log n)$
Code
1 |
|