请编写程序,根据给定的字符和权重值序列,构建哈夫曼树,并将输入的二进制字符串解码输出。
注意:因为哈夫曼编码是不唯一的,所以如果不严格按照指定方法生成哈夫曼树,则有可能无法正确解码。本题规定的哈夫曼树构建限制为:
- 哈夫曼森林的所有根结点存为线性表,新的树根必须插入表头;
- 每次取出权值最小的根结点时,若有并列,取最靠近表头的那个;
- 对于每轮取出的两个根结点,第一个取出的为左子树,第二个取出的为右子树;
- 二进制字符
0
对应树中的左分支;1
对应右分支。
输入格式:
输入首先给出一个正整数 n(1<n≤20),随后 n 行,每行给出一个字符及其权重值,其间以空格分隔。其中字符为小写英文字母,权重值都是不超过 100 的正整数。最后一行给出一个由 0
和 1
组成的二进制字符串,长度不超过 1000,以回车结束。题目保证这个字符串有唯一解码。
输出格式:
在一行中输出解码后的字符串。
输入样例:
5
a 4
b 3
c 2
w 1
z 1
100001110101101101100111
输出样例:
baaacabwbzc
样例说明:
按照本题构建哈夫曼树的规定,生成的哈夫曼编码如下:
a 0
b 10
c 111
z 1100
w 1101