Farmer John 的牛群中有 $N$ ($1 \le N \le 50$) 头牛,它们长得很像,编号为 $1 \dots N$。当 Farmer John 送一头牛回牛棚睡觉时,他必须确定他正在送哪头牛,以便将其放入正确的牛棚。
这些牛可以通过 $P$ ($1 \le P \le 8$) 个属性来区分,属性编号为 $1 \dots P$,每个属性有三种可能的值。例如,牛耳朵上标签的颜色可能是黄色、绿色或红色。为简单起见,每个属性的值都用字母 'X'、'Y' 和 'Z' 表示。Farmer John 的任意两头牛都至少有一个属性不同。
编写一个程序,在给定 Farmer John 牛群中每头牛的属性的情况下,帮助 Farmer John 确定他正在送哪头牛睡觉。你的程序可以向 Farmer John 提问不超过 100 个问题,问题格式为:这头牛的某个属性 $T$ 的值是否在某个集合 $S$ 中?尽量用最少的问题来确定这头牛。
输入格式
- 第一行包含两个空格分隔的整数 $N$ 和 $P$。
- 接下来的 $N$ 行中,每行描述一头牛的属性,包含 $P$ 个空格分隔的字母。每行的第一个字母是属性 1 的值,依此类推。输入中的第二行描述牛 1,第三行描述牛 2,依此类推。
样例
输入样例 1
4 2 X Z X Y Y X Y Y
交互
提问/回答阶段通过标准输入和标准输出进行。
你的程序通过向标准输出写入一行来询问关于正在送去睡觉的牛的问题,该行包含一个字符 'Q',后跟一个空格、属性编号、一个空格以及一个或多个由空格分隔的值的集合。例如,“Q 1 Z Y” 表示 “正在送去睡觉的牛的属性 1 的值是 'Z' 还是 'Y'?”。属性必须是 $1 \dots P$ 范围内的整数。所有值必须是 'X'、'Y' 或 'Z',且在单个问题中,任何值都不能列出多次。
在你的程序提出每个问题后,读取包含单个整数的单行。整数 1 表示正在送去睡觉的牛的指定属性值在给定的值集合中;整数 0 表示不在。
程序的最后一行输出应该是一个字符 'C',后跟一个空格和一个整数,指定你的程序已确定的 Farmer John 正在送去睡觉的牛的编号。
样例交互(针对上述输入样例):
| 输入 | 输出 | 说明 |
|---|---|---|
Q 1 X Z |
||
0 |
可能是牛 3 或牛 4。 | |
Q 2 Y |
||
1 |
必须是牛 4! | |
C 4 |
||
| 程序退出 |
子任务
正确性:占 30% 的分数
只有当指定的牛是与所给回答一致的唯一一头牛时,程序才能获得正确性的满分。如果程序对某个测试点提问超过 100 个问题,则该测试点得 0 分。
提问次数:占 70% 的分数
其余分数将由正确确定牛所需的问题数量决定。测试点的设计旨在奖励最小化最坏情况下的提问次数。对于接近最优提问次数的程序,将给予部分分数。