反向思考,我们考虑每一个长度小于等于 n 且字符集大小为 m 的字符串被多少个长度为 n,字符集大小为 m 的字符串包含了。显然枚举这小的子字符串也是要超时的,不过我们考虑到对于一些子字符串,包含它们的指定字符串数量是相同的。更具体的,如果 w 是一个字符串,我们令 c_w(x) 为关于 x 的一个函数,它的第 i 项为系数为 1 当且仅当 w 有一个长度为 i 的周期(我们规定所有字符串都有一个长度为 0 的周期);否则这一项系数为 0。令 e_{w,i} 为长度为 i,字符集为 m 的包含 w 的字符串数量,然后另 E_w(x) 为它关于 i 的普通生成函数。有一个结论:
然后我们就可以插出多项式从而做出这道题了,不过由于 n 并不是很大所以直接交这个打表程序上去也是可以通过的。时间复杂度 O(3^n\cdot n^2\log n),\log 是多项式求逆的复杂度。
注意到长度为 n 的合法(即 f_v 不为 0)的 v 的数量远小于 2^n,下表给出了对于每一个 n 合法的 v 数量(注意这个数量是和 m 无关的,当然 m=1 除外,证明见 Leo J. Guibas and Andrew M. Odlyzko. Periods in strings. J. of Combinatorial Theory series A, 30:19–42, 1981. 的 Section 5 Theorem 5.1),具体详见 OEIS A005434: