bzoj#P2305. [Apio2011]猜单词

[Apio2011]猜单词

题目描述

「猜单词」是一个双人游戏,在伊朗的青年学生中广为流行。假设有两个游戏者 A 和 B,A 作为先手,首先在一个双方都知道的语料库中选出一个单词,并记在脑海中。随后,他在一张小纸片上划下与单词字母数相等的小横线(不妨设为 nn 条)。

接下来,B 尝试猜出这个单词。每一轮,B 选择一个字母并告诉 A。A 按如下规则回应:

  • 若 B 所说的字母在单词中出现,A 就把它写在对应的横线上。如果整个单词已经完整(所有的字母都已经被猜出),B 获胜。
  • 否则,如果字母没有在单词中出现,A 就把它写在最左侧的下方仍为空白的横线下。如果所有横线下的空白处都已经有字母(也就是说,在这一轮前 B 已经猜了 nn 个错误字母),那么 B 就输了,A 获胜。

例如,A 从语料库中选出了单词 RED,且 B 已经依次猜了字母 A,E,C,D,B 和 R。每一步的结果都在下图中展现,最终 B 获胜。但如果 B 在最后一步猜 S 而不是 R,他就输了。

Failed loading image.

Aidin 是猜单词游戏迷。他相信,如果给定的语料库足够大,且其中的单词相对好,那么玩家 A(先手)可以采取一种不公平的行动——修改选择的单词。也就是说,既然玩家 A 只将单词记在脑海中而不写下来,那他能够在游戏过程中随时变化这个单词,只要使得和当前已经给出的结果依然一致即可。例如,在上面的游戏中,如果单词 RED,BED,LED 和 TED 都在语料库中,那么在第 44 步之后,A 就可以确信他将胜利。他将总是把 B 给出的字母写在横线下(也就是认定其为错误的字母),那么每一次他将至多在集合 {RED,BED,LED,TED} 中失去一个备选单词,最终他将向 B 宣布:「这个单词是,嗯……」,然后再他的集合中说出一个剩下的单词。Aidin 想,如果语料库足够好,那么 A 甚至可能在游戏一开始就确定获胜。例如,如果选择的单词长度为 22,而集合 {ME,MD,DE,ED,AS,IS,AI,SI} 中的单词都在语料库中,那么 A 总能获胜。请自己找出 A 获胜的策略。

给定一个语料库,Aidin 想知道是否无论 B 如何进行游戏,玩家 A 一定能获胜?

请注意在任何一次游戏结束时,如果 A 获胜,A 需要能够给出一个语料库中的单词作为被选出的单词,这个单词应当与 A 所有给出的回答一致。

输入格式

输入包含若干个语料库,每个语料库应该被独立地处理。输入的第一行是一个整数 cc,代表语料库的数目。随后 cc 个语料库以 cc 个模块的形式出现在输入中,每两个模块之间以一个空行隔开。。对于每个输入模块,第一行包含一个正整数 kk,表示语料库中单词的个数。接下来的若干行中包含 k 个单词。相邻的单词以空格、制表符或换行符分隔。每个单词由小于 7 个大写英语字母组成。每个单词都由不同的字母组成,也就是说,同一个字母在一个单词中出现的次数不会超过一次。

输出格式

对于每个语料库,如果玩家 A 有必胜策略(也就是说,不论 B 按什么办法猜,A 总能获胜),输出一行 Yes。否则输出一行 No

2
12
SI ME AND AI ARE MD AS WHEN ED IS DE HAPY
5
A B AB AC AD
Yes
No

数据规模与约定

对于 20%20\% 的数据,k100k \leq 100,每个单词的长度不超过 33
对于 50%50\% 的数据,k300k \leq 300,每个单词的长度不超过 44
对于 100%100\% 的数据,k103k \leq 10^31c201 \leq c \leq 20。输入文件小于 500 KB。