前缀码是一种具有“前缀性质”的编码系统,其要求系统中不存在任何一个码字是系统中另一个码字的前缀(初始部分)。对于定长编码,这显然成立,因此该性质仅在变长编码中需要考虑。
例如,码字集合 $\{9, 55\}$ 具有前缀性质;而由 $\{9, 5, 59, 55\}$ 组成的编码则不具备,因为 “5” 是 “59” 的前缀,也是 “55” 的前缀。前缀码是一种唯一可译码:给定一个完整且准确的序列,接收方无需在单词之间使用特殊标记即可识别出每个单词。然而,也存在不是前缀码的唯一可译码;例如,前缀码的逆序仍然是唯一可译的(即后缀码),但它不一定是前缀码。
前缀码也被称为无前缀码、前缀条件码和瞬时码。虽然霍夫曼编码只是推导前缀码的众多算法之一,但前缀码也被广泛称为“霍夫曼编码”,即使该编码并非由霍夫曼算法产生。术语“逗号自由码”(comma-free code)有时也被用作无前缀码的同义词,但在大多数数学书籍和文章中,逗号自由码被用来指代自同步码,它是前缀码的一个子类。
使用前缀码时,消息可以作为连接的码字序列进行传输,而无需任何带外标记或(可选的)单词间的特殊标记来界定消息中的单词。接收方可以通过重复查找并移除构成有效码字的序列,无歧义地解码消息。这对于缺乏前缀性质的编码通常是不可行的,例如 $\{0, 1, 10, 11\}$:接收方在读取码字开头的 “1” 时,无法判断这到底是完整的码字 “1”,还是码字 “10” 或 “11” 的前缀;因此字符串 “10” 既可以被解释为单个码字,也可以被解释为单词 “1” 和 “0” 的连接。
变长霍夫曼编码、国家呼叫代码、ISBN 的国家和出版商部分、UMTS W-CDMA 3G 无线标准中使用的二次同步码,以及大多数计算机微架构的指令集(机器语言)都是前缀码。
前缀码不是纠错码。在实践中,消息可能会先用前缀码压缩,然后在传输前再次进行信道编码(包括纠错)。
对于任何唯一可译码,都存在一个具有相同码字长度的前缀码。克拉夫特不等式(Kraft’s inequality)刻画了唯一可译码中可能存在的码字长度集合。
在本题中,给定一个包含 $N$ 个码字的编码。每个单词仅包含数字 $\{0, 1, 2, 3, 4, 5, 6, 7, 8, 9\}$。你需要检查该编码是否满足前缀性质:系统中不存在任何一个码字是另一个码字的前缀。
输入格式
输入的第一行给出测试用例的数量 $T$ ($1 \le T \le 100$)。接下来是 $T$ 个测试用例。 每个测试用例的第一行包含一个整数 $N$ ($1 \le N \le 10,000$),表示码字的数量。 随后有 $N$ 行,每行包含一个码字。每个码字是一个长度不超过十位的数字序列。
输出格式
对于每个测试用例,输出一行 “Case #x: y”,其中 $x$ 是测试用例编号(从 1 开始),如果该编码是前缀码,则 $y$ 为 “Yes”,否则为 “No”。
样例
样例输入 1
3 2 9 55 4 9 5 59 55 4 01 01 123 321
样例输出 1
Case #1: Yes Case #2: No Case #3: No