1 条题解

  • 0
    @ 2025-3-8 19:49:42

    子任务 1:保证 1n41 \leq n \leq 4

    枚举所有情况即可,时间复杂度 O(26nn3)O(26^n n^3)

    子任务 2:保证字符串 ss 不包含字符 ?

    相当于计数,枚举三个位置即可,时间复杂度 O(n3)O(n^3)

    子任务 3:保证 1n81 \leq n \leq 8

    因为如果一个 ? 不是 wmy 三者时等价,所以每个位置只有 44 种情况,枚举即可。时间复杂度 O(4nn3)O(4^n n^3)

    子任务 4:保证 1n281 \leq n \leq 28

    如果后面的子任务的做法实现不够优秀,仍然可以通过该子任务。

    子任务 5:保证 n40n \leq 40m80m \leq 80

    考虑动态规划。

    f(i,W,M,Y)f(i, W, M, Y) 表示前 ii 个字符串,有 WW 个字符 w,有 MM 个子序列 wm,有 YY 个子序列 wmy 是否可行。

    构造只需要倒推即可。

    注意到只有 W,M,YmW, M, Y \leq m 时状态有效,时间复杂度 Θ(mn3)\Theta(mn^3)

    子任务 6:保证 n40n \leq 40

    可以把子序列的贡献算在字符 m 上,贡献为之前的 w 的数量乘之后的 y 的数量。

    仍然考虑动态规划,设 f(i,j,W,Y)f(i,j,W,Y) 表示前 ii 个字符串中的 m 贡献的子序列数为 jjWW 表示前 ii 个字符串有多少个 wYY 表示后 nin-i 个字符串多少个 y 是否可行。转移时枚举当前位置所填的字符,构造只需要倒推即可。时间复杂度 Θ(n3m)\Theta(n^3m)

    注意到子任务 5 的解法中状态表示的只是是否可行,也可以使用 std::bitset 优化来通过子任务 6,时间复杂度 Θ(nm3w)\Theta\left(\frac{nm^3}{w}\right)

    子任务 8:无特殊限制。

    注意到子任务 6 中状态表示的只是是否可行,可以使用 std::bitset 优化,时间复杂度 Θ(n3mw)\Theta\left(\frac{n^3m}{w}\right)

    信息

    ID
    1348
    时间
    1000ms
    内存
    1024MiB
    难度
    9
    标签
    (无)
    递交数
    14
    已通过
    4
    上传者