SP2271 UCODES - Undecodable Codes

题目描述

Phil Oracle 拥有一种特殊的能力,使他在国家情报局中成为无可替代的人物。他的同事们可以带给他任何新的二进制代码,他能立刻判断这个代码是否具有唯一可解性。所谓的“代码”指的是将字母表中的每个字符,分配一个唯一的字符序列(称为“码字”)。二进制代码就是那些码字由 0 和 1 组成的代码。例如,以下示例展示了字母表 {**a, c, j, l, p, s, v**} 的两种可能的二进制代码。 ![Code Example](https://cdn.luogu.com.cn/upload/vjudge_pic/SP2271/6f205f8c653a301c0df1f977e38d5a1bccbf6210.png) “编码”是指将明文中的每个字符用其对应的码字替换,然后按顺序连接形成的字符串。如果一个代码能够使得用它编码后的所有可能明文结果都是唯一的,那么它就是“唯一可解码”的。在上面的例子中,代码 1 是唯一可解码的,而代码 2 不是。比如,明文 "**pascal**" 和 "**java**" 都会被编码为 **001010101010**。此外,更短的编码 **01** 和 **10** 也是不可唯一解码的。 尽管情报局对 Phil 的能力感到自豪,但他只能给出简单的“是”或“不是”答案。局里的某些成员希望能得到更具体的证据,特别是在处理那些不能唯一解码的代码时。对于这类问题,您只需要专注于不可唯一解码的代码任务。对于其中的每个代码,您需要找出最短的编码形式(以比特为单位),因为这种编码可能来源于两个或更多不同的明文而显得歧义。如果多种编码长度相同,则选取字典序最小的那个。

输入格式

输入包括一个或多个代码。每个代码由一个整数 $m$ 开始,$1 \leq m \leq 20$,出现在独立的一行中,代表这个代码中包含的二进制码字的数量。接下来的 $m$ 行中,每行包括一个二进制码字,其前后可能有多余的空格。每个码字的长度不会超过 20 位。 输入的最后是一个独立的一行,包含数字 0,表示输入结束。

输出格式

对于每个代码,输出该代码的序号(从 1 开始),最短的不可唯一解码的编码的长度,以及这个最短编码本身。如果有多个编码长度相同,则按字典序选择最小的那个。每行输出 20 位编码,最后一行可以少于 20 位。每个代码输出之后需要空一行。请按照示例格式输出。 **本翻译由 AI 自动生成**