P12116 [NWRRC2024] Longest Common Substring
没有继续调下去的欲望了。
要求最长公共子串为 \(w\) 只有两个限制:
- 两个串中必须都要出现过 \(w\)。
- 两个串中都出现过的子串长度最大不能超过 \(|w|\)。
设 \(f_{i, j, k, 0/1}\) 表示前 \(i\) 位,最后 \(|w|\) 位状态为 \(j\),出现过的子串中长度为 \(|w| + 1\) 的 \(2^{|w| + 1}\) 种串的出现状态为 \(k\),有没有出现过 \(w\) 的方案数,转移只需要用一点位运算手法就可以了。
考虑最后一步将 \(k\) 那一维求一个和列为两个数组 \(f, g\),答案要求 \(\sum_{i \text{and} j = \emptyset} f_i g_j\),那么很经典是吧,用一个高维前缀和即可。

浙公网安备 33010602011771号