【题解】「NOIP2024模拟赛33 T3」朱雀湖
【题解】「NOIP2024模拟赛33 T3」朱雀湖
https://www.becoder.com.cn/contest/5809/problem/3
\(\mathcal{Description}\)
原题:https://contest.ucup.ac/contest/1511/problem/8211
有两个字符集为 \(k\) 的字符串:\(S,P\),满足 \(P\) 中每个字符至多出现 \(2\) 次。
定义 \(F(S,P)\) 表示:\(P\) 在 \(S\) 中互不相交的最多匹配次数。
问,所有可能的 \(F\) 的和。
\(\mathcal{Solution}\)
拜谢传奇计数王:劳郑。
下 \(V\) 表示字符集大小。
Part.1
因为 \(P\) 的内容与答案关心不大,先考虑给定 \(P\),怎么算 \(F(S,P)\) 的贡献和。
为保证方案的唯一, 我们钦定每个字串只会在第一次出现的时候算贡献(这样也恰能在满足不相交的条件下,使匹配次数最大)。
设 \(S\) 中与 \(P\) 匹配的位置是 \(i\),那么其产生的贡献为:\(V^{n-m}\)。同时这个子串,产生重复贡献当且仅当:存在一个匹配位置 \(j\) 使得:\(j>i-m\),即有重叠部分(border)因为我们钦定了 \(i\) 这里必须算贡献,那么就要减去 \(j\) 处的贡献,同时还要加上 \(j\) 以前删去的多余贡献……那就是容斥。具体的:
因为题目保证每个字符出现次数不能超过 \(2\) 次,那么 border 长度不会超过 \(\lfloor\frac n2\rfloor\),也就是说 \(S\) 中的每个位置至多被两个能够匹配的字串覆盖。这样容斥变得容易了,答案即为:
其中:
- \(j\) 为 border 长度;
- \(i\) 为 \(P\) 在 \(S\) 中的匹配位置;
- \(k\) 为从 \(i\) 往前跟 \(P\) 匹配且与 \(i\) 直接或间接重叠的个数;
- \(g(j)\) 为 \(P\) 具有长度为 \(j\) 的 border 的方案数;
- \(\Delta=g(0)(n-m+1)V^{n-m}\) 为 border \(=0\) 时的贡献。
直接求解较松的上界是 \(O(n^2\ln n)\)。
注意到 \(i\) 的取值实际上关系不大:(不看式子,的确确定匹配某一位置之后剩下的方案数也应该是定值
调和级数,所以时间复杂度为 \(O(n\ln n)\)。
Part.2
现在考虑求解 \(g(j)\)。
枚举中间部分出现两次的字符个数 \(i\),容易拿出:
注意,\(g(0)\) 不能直接按照上式来计算,因为没有两边 border 的限制中间的部分就不能乱填了,如果乱填了可能就出现 border 了。所以按照上式算完 \(g(0)\) 后还要减去 \(\displaystyle\sum_{i=1}^{\lfloor\frac m2\rfloor} g(i)\)。
暴力算组合数复杂度为 \(O(m^3)\)。注意到每个组合数上项至多有 \(O(m)\) 种取值,预处理一下可以在 \(O(m^2)\) 求出 \(g(j)\)。
\(\mathcal {Summay}\)
考场上总体的思路是想到了的,Part.2 也推出来了,但是 Part.1 一直在想 dp 怎么做。还是容斥等计数手段掌握不熟练。