#P1223. DEHUFF

    ID: 224 传统题 1000ms 256MiB 尝试: 2 已通过: 1 难度: 10 上传者: 标签>回溯算法前缀编码验证字符串处理Greater New York 2002

DEHUFF

描述

某种数据压缩技术涉及创建一个可变长度的二进制编码表,其中一个或多个二进制位用于表示字母表中的单个字母。通常,出现在单词中的字母会比不常出现的字母拥有更短的二进制编码。例如,在一个包含字母AAZZ的字母表中,字母EE通常比字母QQ出现得更频繁,因此预期EE的二进制编码会比QQ的二进制编码短。

给定一个包含字母表中至少一个字母的样本字符串,以及该样本字符串的完整二进制编码,你应该能够生成每个字母的至少一个二进制编码表。例如,考虑样本字符串:"CAB""CAB",它包含字母表{A,B,CA, B, C}中的每个字母。如果"CAB""CAB"的二进制编码是"01011""01011",那么(唯一的)二进制编码表为:

C=0C = 0

A=10A = 10

B=11B = 11

这些二进制编码是前缀编码,即集合中的任何编码都不能是其他编码的前缀(例如A=01A = 01B=011B = 011是不允许的)。对于这个问题,你需要编写一个程序来确定样本字符串及其二进制编码的二进制编码表。如果存在唯一的二进制编码表,则输出该编码表(按字母的ASCII值排序)。如果可以生成多个二进制编码表,则输出"多种编码表"。注意:对于给定的字母表,整个编码空间都会被使用;也就是说,不会有未使用的编码。

输入

输入的第一行是一个整数NN,表示接下来有NN个数据集。每个数据集由两行组成。第一行是样本字符串,包含字母表中的至少一个字母(或空格)。第二行是样本字符串的二进制编码。注意:样本字符串只能包含大写字母和空格。

输出

对于每个数据集,输出一行来标识数据集,格式为:"DATASET #n",其中nn是数据集编号(11NN)。如果可以生成多个二进制编码表来表示字母表,则在新的一行输出"多种编码表"并继续处理下一个数据集。如果只能生成一个二进制编码表,则按字母表的顺序(按照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