QOJ.ac

QOJ

時間限制: 2 s - 3 s 記憶體限制: 1024 MB 總分: 30

#5859. 杀手单词

统计

你正在和朋友 Sean 玩猜词游戏(Hangman)。虽然你听说 Sean 很擅长从婴儿手中抢糖果,但他在这个游戏上却不怎么在行。你能利用 Sean 不完美的策略,让他输得尽可能惨吗?

+--+
|  O
| /|\       Mystery word: _ a _ a _ a _
| / \
|
+-+---+

猜词游戏的规则如下:

  • 有一个包含所有合法单词的字典 D,你和 Sean 都知道。单词仅由字符 a - z 组成。特别地,单词中不包含空格。
  • 你首先从 D 中选择任意一个单词,并将其写在黑板上,将每个字母替换为下划线:_
  • 在 Sean 的回合,他可以选择任意一个字母并询问你该字母是否在单词中。如果存在,你需揭示该字母在单词中的所有位置。否则,Sean 扣除一分。
  • 一旦单词中的所有字母都被揭示,该轮游戏结束。
  • 无论 Sean 扣除多少分,游戏都不会提前结束。

Sean 使用一种非常简单的策略。他将 26 个字母按某种顺序排列成列表 L,并逐个遍历该列表。如果字典 D 中至少有一个单词满足:(a) 包含他当前考虑的字母,且 (b) 与你目前在黑板上写出的内容以及 Sean 之前所有猜测的结果相符,那么 Sean 就会猜测该字母。否则,他会跳过该字母。无论如何,Sean 随后都会继续处理列表中的下一个字母。

给定 Sean 的列表,你应该选择哪个单词才能让 Sean 扣除尽可能多的分数?如果存在多个同样好的选择,你应该选择在 D 中出现最早的那个单词。

样例

假设 Sean 决定按字母顺序猜测(即 L = "abcdefghijklmnopqrstuvwxyz"),且 D 包含单词 bananacaravanpajamas。如果你选择 pajamas,游戏过程如下:

  • 你首先在黑板上写下 7 个下划线 _ _ _ _ _ _ _。根据下划线的数量,Sean 立即知道单词要么是 caravan,要么是 pajamas
  • Sean 首先猜测 a,因为它是 L 中的第一个字母,你揭示了黑板上 a 的所有位置:_ a _ a _ a _
  • Sean 跳过 b,尽管它出现在 banana 中。Sean 已经知道那不是你的单词。
  • 然后他猜测 c,因为它出现在 caravan 中。但它并没有出现在你实际选择的单词中,所以 Sean 扣除一分,且没有揭示更多信息。
  • 通过排除法,Sean 现在知道你的单词一定是 pajamas,于是他按顺序猜测 jmps,不再扣除任何分数。

因此,如果你选择 pajamas,Sean 会扣除一分。如果选择其他两个单词,他都不会扣除任何分数。

输入格式

输入的第一行包含测试用例的数量 T。接下来是 T 个测试用例。每个测试用例的第一行包含整数 NM,分别表示字典中的单词数量和需要考虑的列表数量。

接下来的 N 行包含字典中的单词,每行一个:D1, D2, ..., DN。每个单词都是由字符 a - z 组成的任意序列。

最后的 M 行包含 Sean 将使用的所有列表,每行一个:L1, L2, ..., LM。每个列表长度恰好为 26 个字母,且每个字母恰好出现一次。Sean 将按照上述描述使用这些列表来猜测字母。

输出格式

对于每个测试用例,输出一行,包含 "Case #x: w1 w2 ... wM",其中 x 是用例编号(从 1 开始),wi 是当 Sean 按列表 Li 猜测时你应该选择的单词。如果多个单词导致 Sean 扣除的分数相同,你应该选择在字典中出现最早的那个。

数据范围

$1 \le \mathbf{T} \le 10$。

字典 D 中的每个单词长度在 1 到 10 个字符之间。

在单个测试用例中,字典 D 中不会有两个相同的单词。

内存限制:1GB。

小数据集(测试集 1 - 可见;10 分)

$1 \le \mathbf{N} \le 100$。

$1 \le \mathbf{M} \le 10$。

时间限制:2 秒。

大数据集(测试集 2 - 隐藏;20 分)

$1 \le \mathbf{N} \le 10000$。

$1 \le \mathbf{M} \le 100$。

时间限制:3 秒。

样例

输入 1

2
3 2
banana
caravan
pajamas
abcdefghijklmnopqrstuvwxyz
etaoisnhrdlcumwfgypbvkjxqz
4 1
potato
tomato
garlic
pepper
zyxwvutsrqponmlkjihgfedcba

输出 1

Case #1: pajamas caravan
Case #2: garlic

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.