【题解】「NOIP2024模拟赛33 T3」朱雀湖

【题解】「NOIP2024模拟赛33 T3」朱雀湖

https://www.becoder.com.cn/contest/5809/problem/3


Description

原题:https://contest.ucup.ac/contest/1511/problem/8211

有两个字符集为 k 的字符串:S,P,满足 P 中每个字符至多出现 2 次。

定义 F(S,P) 表示:PS​​ 中互不相交的最多匹配次数。

问,所有可能的 F 的和。


Solution

拜谢传奇计数王:劳郑。

V​ 表示字符集大小。

Part.1

因为 P 的内容与答案关心不大,先考虑给定 P,怎么算 F(S,P) 的贡献和。

为保证方案的唯一, 我们钦定每个字串只会在第一次出现的时候算贡献(这样也恰能在满足不相交的条件下,使匹配次数最大)。

S 中与 P 匹配的位置是 i,那么其产生的贡献为:Vnm。同时这个子串,产生重复贡献当且仅当:存在一个匹配位置 j 使得:j>im,即有重叠部分(border)因为我们钦定了 i 这里必须算贡献,那么就要减去 j 处的贡献,同时还要加上 j 以前删去的多余贡献……那就是容斥。具体的:

因为题目保证每个字符出现次数不能超过 2 次,那么 border 长度不会超过 n2,也就是说 S 中的每个位置至多被两个能够匹配的字串覆盖。这样容斥变得容易了,答案即为:

Ans=j=1m2i=mnk=0imk(mj)0(1)kg(j)Vimk(mj)Vni+Δ

其中:

  • j 为 border 长度;
  • iPS 中的匹配位置;
  • k 为从 i 往前跟 P 匹配且与 i​​ 直接或间接重叠的个数;
  • g(j)P 具有长度为 j 的 border 的方案数;
  • Δ=g(0)(nm+1)Vnm 为 border =0 时的贡献。

直接求解较松的上界是 O(n2lnn)

注意到 i 的取值实际上关系不大:(不看式子,的确确定匹配某一位置之后剩下的方案数也应该是定值

Ans=(j=1m2g(j)k=0m+k(mj)n(1)kVnmk(mj)i=m+k(mj)n1)+Δ=(j=1m2g(j)k=0m+k(mj)n(1)kVnmk(mj)(n(m+k(mj))+1))+Δ

调和级数,所以时间复杂度为 O(nlnn)


Part.2

现在考虑求解 g(j)

枚举中间部分出现两次的字符个数 i,容易拿出:

g(j)=(Vj)j!i=0m2j2(Vji)(Vjim2j2i)(m2j)!12i

注意,g(0) 不能直接按照上式来计算,因为没有两边 border 的限制中间的部分就不能乱填了,如果乱填了可能就出现 border 了。所以按照上式算完 g(0) 后还要减去 i=1m2g(i)

暴力算组合数复杂度为 O(m3)。注意到每个组合数上项至多有 O(m) 种取值,预处理一下可以在 O(m2) 求出 g(j)​。


Summay

考场上总体的思路是想到了的,Part.2 也推出来了,但是 Part.1 一直在想 dp 怎么做。还是容斥等计数手段掌握不熟练。

posted @   CloudWings  阅读(22)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示