题解:P15650 [省选联考 2026] 摩卡串 / string

· · 题解

感觉小于 T1,但是场上只写了 75。/ll

数据范围不太像贪心构造 Ad-hoc 之类,考虑 dp。

考虑如何计算在一个串 t 末尾加入一个字符的贡献。首先考虑不加入这个字符就已经确定 <s 的后缀,不管加入任何字符都会产生贡献。然后考虑等于 s 某个前缀的后缀,如果在 s 中对应下一位是 1,加入 0 之后会变成 <s 的后缀,带来贡献。

于是有 dp_{i,j,x,0/1} 表示当前串 t 末尾最长有 i 位等于 s[1:i],有 j 个后缀已经确定 <stx 个子串 <ss 是否是 t 的子串 时 t 的最短长度。

转移考虑枚举在末尾加入 0/1,可以用 kmp 自动机维护 i 这一维,并且预处理出所有的贡献来计算新的 j,x

直接做是 O(nk^2)(考场上写的这个),但是分析一下 j 的上界在 O(\sqrt k) 级别,所以可以做到 O(nk\sqrt k)