1 条题解
-
0
1. 规则转化
每个位置只能有两种类型(元音
V或辅音C),规则形如:若
pos1是t1,则pos2必须是t2。逻辑等价为: [ (\text{type}[p_1] \ne t_1) \ \lor\ (\text{type}[p_2] = t_2) ] 这是典型的 2-SAT 形式(每个位置两个变量:
pos=V和pos=C,互斥)。
2. 整体思路
我们需要找 字典序 ≥ s 的最小合法单词。
- 字母表前
l个字母,每个字母类型固定(由第一行字符串决定)。 - 一个合法单词 = 每个位置选一个字母,其类型分布满足所有规则。
贪心构造:
从位置 1 到 n 依次确定字母:
- 如果前面已经确定的部分已经 大于 s 对应前缀,则后面可以选该位置允许的最小字母(并满足规则)。
- 如果前面与 s 相等,则当前位置的字母必须 ≥ s 对应字母。
- 每次选一个字母后,判断剩余位置能否存在合法类型分布(用 2-SAT 判断)。
3. 可行性判断(2-SAT)
构建 2-SAT:
- 每个位置 i 有两个节点:
i_V(i 是元音)、i_C(i 是辅音),且i_V与i_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
- 上传者