Problem D: 哈夫曼编码

Problem D: 哈夫曼编码

[Creator : ]
Time Limit : 1.000 sec  Memory Limit : 128 MiB

Description

给定  个不同的单词及其出现的频次,请你构造一种哈夫曼编码(Huffman Coding)方案。

哈夫曼编码是一种可变长前缀编码,它通过构建哈夫曼树来实现,使得所有单词的编码长度与其频次的乘积之和(即带权路径长度,WPL)最小。在哈夫曼树中,左分支通常代表 ,右分支通常代表 

由于构建哈夫曼树时,对于权值相同的节点合并顺序不同,以及左右子树的分配不同,可能会产生多种满足条件的编码方案。本题只需输出任意一种合法的哈夫曼编码方案即可。输出的单词顺序应与输入顺序保持一致。

Input

第一行包含一个正整数 ,表示单词的个数。

接下来  行,每行包含一个由小写英文字母组成的非空字符串  和一个正整数 ,分别表示第  个单词及其出现的频次。

Output

输出共  行。

每行输出一个字符串和一个  字符串,中间以一个空格隔开,分别表示单词  及其对应的哈夫曼编码。

输出的单词顺序应与输入顺序保持一致。

Sample Input Copy

4
a 1
b 2
c 3
d 4

Sample Output Copy

a 110
b 111
c 10
d 0

HINT

样例 1 解释

对于第一组数据,一种构建过程如下:

  1. 取出频次最小的 )和 ),合并为一个新节点,权值为 
  2. 当前权值集合为 (其中第一个  为新节点,第二个  为 )。
  3. 取出最小的 )和新节点(),合并为一个新节点,权值为 
  4. 当前权值集合为 
  5. 取出 )和新节点(),合并为根节点,权值为 

假设每次合并时,权值较小的节点作为左子树(标记为 ),权值较大的节点作为右子树(标记为 );若权值相同,则任意分配。 对于上述构建的一种可能树结构:

  •  位于根节点的左侧(编码 )。
  •  位于根节点  右节点  左节点(编码 )。
  •  位于根节点  右节点  右节点  左节点(编码 )。
  •  位于根节点  右节点  右节点  右节点(编码 )。

带权路径长度 ,这是理论最小值。其他满足 WPL 最小的编码方案也被视为正确答案。

数据范围

对于  的数据,满足 ,字符串  的长度不超过 ,且 。保证所有字符串  互不相同。