1 条题解

  • 0
    @ 2026-4-12 23:41:33

    1. 规则转化

    每个位置只能有两种类型(元音 V 或辅音 C),规则形如:

    pos1t1,则 pos2 必须是 t2

    逻辑等价为: [ (\text{type}[p_1] \ne t_1) \ \lor\ (\text{type}[p_2] = t_2) ] 这是典型的 2-SAT 形式(每个位置两个变量:pos=Vpos=C,互斥)。


    2. 整体思路

    我们需要找 字典序 ≥ s 的最小合法单词

    • 字母表前 l 个字母,每个字母类型固定(由第一行字符串决定)。
    • 一个合法单词 = 每个位置选一个字母,其类型分布满足所有规则。

    贪心构造:

    从位置 1 到 n 依次确定字母:

    • 如果前面已经确定的部分已经 大于 s 对应前缀,则后面可以选该位置允许的最小字母(并满足规则)。
    • 如果前面与 s 相等,则当前位置的字母必须 ≥ s 对应字母。
    • 每次选一个字母后,判断剩余位置能否存在合法类型分布(用 2-SAT 判断)。

    3. 可行性判断(2-SAT)

    构建 2-SAT:

    • 每个位置 i 有两个节点:i_V(i 是元音)、i_C(i 是辅音),且 i_Vi_C 互斥。
    • 规则 (p1, t1, p2, t2) 转化为:
      • 如果 p1 是 t1,则 p2 必须是 t2。
      • 等价于:若 p1 是 t1,则 p2 不是 ¬t2
      • 即: [ (p1 = t1) \implies (p2 = t2) ] 等价: [ (p1 \ne t1) \lor (p2 = t2) ] 添加两条子句(逻辑推导边)。

    此外,已固定的字母类型(当前位确定后)直接作为单子句加入。

    如果 2-SAT 有解 → 剩余位置存在合法类型分布。


    4. 字母到类型的对应

    当我们固定某个位置的字母 ch

    • 其类型由 kind[ch - 'a'] 决定。
    • 在 2-SAT 中强制该位置取该类型,并检查是否可行。

    5. 构造过程

    ans = ""
    for pos = 1..n:
        if 前缀已经大于 s:
            startChar = 'a'
        else:
            startChar = s[pos-1]
        for ch = startChar .. 'a'+l-1:
            类型 t = kind[ch - 'a']
            强制 pos 的类型 = t(在 2-SAT 中设该变量为真)
            运行 2-SAT 判断剩余位置是否可满足:
                - 若有解:
                    ans += ch
                    break
                - 否则继续尝试下一个字母
        如果当前位没找到任何可行字母 -> 回溯到前一位(无解则输出 -1)
    

    6. 复杂度

    • 每位最多尝试 l ≤ 26 个字母。
    • 每次尝试做一次 2-SAT:O(n + m)。
    • 总 O(n × l × (n+m)),n ≤ 200, m ≤ 4n² ≈ 1.6e5,可接受。

    7. 特判

    • 如果一开始就没有任何合法类型分布(空约束?几乎不会),直接 -1。
    • 如果全程找不到 ≥ s 的,-1。

    这样即可得到题目所求的最小字典序合法单词。

    • 1

    信息

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