你正在和朋友 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 包含单词 banana、caravan 和 pajamas。如果你选择 pajamas,游戏过程如下:
- 你首先在黑板上写下 7 个下划线
_ _ _ _ _ _ _。根据下划线的数量,Sean 立即知道单词要么是caravan,要么是pajamas。 - Sean 首先猜测
a,因为它是 L 中的第一个字母,你揭示了黑板上a的所有位置:_ a _ a _ a _。 - Sean 跳过
b,尽管它出现在banana中。Sean 已经知道那不是你的单词。 - 然后他猜测
c,因为它出现在caravan中。但它并没有出现在你实际选择的单词中,所以 Sean 扣除一分,且没有揭示更多信息。 - 通过排除法,Sean 现在知道你的单词一定是
pajamas,于是他按顺序猜测j、m、p和s,不再扣除任何分数。
因此,如果你选择 pajamas,Sean 会扣除一分。如果选择其他两个单词,他都不会扣除任何分数。
输入格式
输入的第一行包含测试用例的数量 T。接下来是 T 个测试用例。每个测试用例的第一行包含整数 N 和 M,分别表示字典中的单词数量和需要考虑的列表数量。
接下来的 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