1 条题解

  • 0
    @ 2026-9-3 11:06:33

    题解

    思路

    令 ai,bia_i,b_i 分别是两个名字中字母 ii 的出现次数。设 xix_i 表示昵称中有多少个位置把 A′A' 的字母 ii 配成了 B′B' 的字母 i+1i+1。那么 B′B' 实际使用的字母 ii 数量为

    ci=ai−xi+xi−1.c_i=a_i-x_i+x_{i-1}.

    必须满足 ci≤bic_i\le b_i。固定所有 xix_i 后,不同昵称对的排列数为

    N!∏iai!∏i(aixi).\frac{N!}{\prod_i a_i!}\prod_i\binom{a_i}{x_i}.

    做法

    按字母从 A 到 Y 做 DP。若上一字母有 p=xi−1p=x_{i-1} 个向后匹配,当前选择 x=xix=x_i,容量约束等价于

    p≤bi−ai+x.p\le b_i-a_i+x.

    因此转移是上一层 DP 的一个前缀和,再乘 (aix)\binom{a_i}{x}。维护前缀和后,每层时间为 O(ai)O(a_i)。最后在 Z 处要求 aZ+xY≤bZa_Z+x_Y\le b_Z,再乘上 AA 的多重集排列数。

    N≤9N\le9 时可以枚举所有 xix_i;N≤2000N\le2000 时可不维护前缀和,直接枚举相邻两层状态。

    正确性说明

    每个合法昵称对按位置唯一决定每个 xix_i;反之,满足容量约束的 xix_i 可以从 BB 中取出所需字符。固定 xix_i 时,先排列 A′A' 的多重集,再从每种字母的所有位置中选择 xix_i 个改为下一字母,恰得到公式中的计数,且不会重复。DP 恰好枚举所有满足相邻容量约束的 xix_i,所以求和后得到全部合法昵称对。

    复杂度

    满分算法时间复杂度为 O(N+M+26)O(N+M+26),空间复杂度为 O(N)O(N)。

    • 1

    信息

    ID
    1423
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者