1 条题解
-
0
题解
思路
令 分别是两个名字中字母 的出现次数。设 表示昵称中有多少个位置把 的字母 配成了 的字母 。那么 实际使用的字母 数量为
必须满足 。固定所有 后,不同昵称对的排列数为
做法
按字母从
A到Y做 DP。若上一字母有 个向后匹配,当前选择 ,容量约束等价于因此转移是上一层 DP 的一个前缀和,再乘 。维护前缀和后,每层时间为 。最后在
Z处要求 ,再乘上 的多重集排列数。时可以枚举所有 ; 时可不维护前缀和,直接枚举相邻两层状态。
正确性说明
每个合法昵称对按位置唯一决定每个 ;反之,满足容量约束的 可以从 中取出所需字符。固定 时,先排列 的多重集,再从每种字母的所有位置中选择 个改为下一字母,恰得到公式中的计数,且不会重复。DP 恰好枚举所有满足相邻容量约束的 ,所以求和后得到全部合法昵称对。
复杂度
满分算法时间复杂度为 ,空间复杂度为 。
- 1
信息
- ID
- 1423
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者