#P1223. DEHUFF
DEHUFF
描述
某种数据压缩技术涉及创建一个可变长度的二进制编码表,其中一个或多个二进制位用于表示字母表中的单个字母。通常,出现在单词中的字母会比不常出现的字母拥有更短的二进制编码。例如,在一个包含字母到的字母表中,字母通常比字母出现得更频繁,因此预期的二进制编码会比的二进制编码短。
给定一个包含字母表中至少一个字母的样本字符串,以及该样本字符串的完整二进制编码,你应该能够生成每个字母的至少一个二进制编码表。例如,考虑样本字符串:,它包含字母表{}中的每个字母。如果的二进制编码是,那么(唯一的)二进制编码表为:
这些二进制编码是前缀编码,即集合中的任何编码都不能是其他编码的前缀(例如,是不允许的)。对于这个问题,你需要编写一个程序来确定样本字符串及其二进制编码的二进制编码表。如果存在唯一的二进制编码表,则输出该编码表(按字母的ASCII值排序)。如果可以生成多个二进制编码表,则输出"多种编码表"。注意:对于给定的字母表,整个编码空间都会被使用;也就是说,不会有未使用的编码。
输入
输入的第一行是一个整数,表示接下来有个数据集。每个数据集由两行组成。第一行是样本字符串,包含字母表中的至少一个字母(或空格)。第二行是样本字符串的二进制编码。注意:样本字符串只能包含大写字母和空格。
输出
对于每个数据集,输出一行来标识数据集,格式为:"DATASET #n",其中是数据集编号(到)。如果可以生成多个二进制编码表来表示字母表,则在新的一行输出"多种编码表"并继续处理下一个数据集。如果只能生成一个二进制编码表,则按字母表的顺序(按照ASCII值排序)为每个字母输出该字母、一个空格、一个等号()、一个空格和该字母的二进制编码。
3
CAB
01011
HELLO WORLD
111011011110111101111100111111111111011111101111010
ABCDEFGHI
010110111011110111110111111011111110001011111111
DATASET #1
A = 10
B = 11
C = 0
DATASET #2
= 0
D = 10
E = 110
H = 1110
L = 11110
O = 111110
R = 1111110
W = 1111111
DATASET #3
MULTIPLE TABLES
来源
Greater New York 2002