Files
luogu/P13366.md
T
2026-08-13 22:21:14 +08:00

70 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# P13366 [GCJ 2011 #1A] The Killer Word 题解
参考了 [官方pdf题解](https://www.luogu.com.cn/fe/api/problem/downloadAttachment/zsdw8913)
## 思路
如果对于每一张字母表、每一个单词都单独模拟 Hangman,复杂度会达到 $O(N^2M)$,无法通过大数据。
关键观察是:
- 游戏开始时,Sean 只能根据单词长度判断候选单词,因此不同长度的单词互不影响。
- 当 Sean 猜测一个字母时,当前候选集合中的单词会根据该字母出现的位置得到不同反馈。
- 得到相同反馈的单词在之后仍然无法区分,因此可以继续放在同一个候选组中。
- 如果某个候选组中没有单词包含当前字母,Sean 会跳过该字母,候选组不发生变化。
- 如果候选组中存在单词包含当前字母,Sean 会猜这个字母。此时不包含该字母的单词所在分支会让 Sean 失去 $1$ 分。
因此,不必为每个目标单词分别模拟游戏,而是同时维护所有单词的候选集合。
## 状态表示
对于每个长度,初始时将所有该长度的单词放入同一个候选组。
一个候选组表示:
> 在已经猜过的字母及其反馈下,Sean 仍然无法区分的所有单词。
对于某个字母,使用一个二进制表示它在单词中出现的位置。
例如:
- 单词 `banana`
- 字母 `a`
- `a` 出现在第 $1,3,5$ 位(下标从 $0$ 开始)
则对应二进制为:
$$
0101010_2
$$
两个单词对于当前字母得到相同编码,当且仅当 Sean 从黑板上看到的反馈相同,因此它们应被分到同一个新候选组中。
## 转移过程
对于一张字母表 `L`
1. 按单词长度初始化候选组。
2.`L` 中的顺序枚举每个字母。
3. 对每个当前候选组:
- 若组内只剩一个单词,Sean 已经确定答案,不再需要处理该组。
- 计算组内每个单词对当前字母的出现位置二进制表示。
- 若所有二进制表示均为 $0$,说明没有候选单词包含该字母,Sean 会跳过该字母,候选组保持不变。
- 否则,Sean 会猜该字母:
- 二进制为 $0$ 的单词不含该字母,对这些单词的失分加一;
- 按二进制表示将原候选组拆分为多个新候选组。
4. 所有字母处理结束后,选择失分最多的单词。
5. 若失分相同,保留字典中下标较小的单词即可满足题目的平局规则。
## 复杂度分析
单词长度最大为 $10$,字母表长度固定为 $26$。
对于每一张字母表,每个单词最多参与 $26$ 次分组,每次计算位置二进制表示需要 $O(10)$。
因此总时间复杂度为:
$$
O(M \times 26 \times N \times 10)=O(NM)
$$