#P1261. Huffman Trees
Huffman Trees
题目描述:
一种相对简单的数据压缩方法是通过为文件创建霍夫曼树并使用它来压缩和解压缩数据。大多数应用使用二叉树(每个节点是叶子节点或有两个子节点),但也可以构造任意子节点数的霍夫曼树(如三叉树或N叉树)。
包含Z个不同字符的文件对应的霍夫曼树有Z个叶子节点。从根到叶子的路径决定了字符的编码,路径上的每个步骤对应一个编码字符(可以是0,1,...,N-1)。通过将高频字符放在靠近根的位置,低频字符远离根,实现有效压缩。严格来说,只有当编码使用最少数量的N进制符号时,这样的树才是霍夫曼树。
解压缩时需要知道压缩使用的树结构。本题采用的方法是在数据流前添加一个头部,包含文件中所有字符的编码(按字典序排列)。
给定源符号数Z、霍夫曼树的N叉数N和头部字符串,建立源符号到编码符号的映射。
输入格式:
- 第一行:测试用例数T
- 每个测试用例:
- 第一行:不同字符数Z(2≤Z≤20)
- 第二行:霍夫曼树的N叉数N(2≤N≤10)
- 第三行:头部字符串(由0到N-1的数字组成,长度<200)
输出格式:
- 每个测试用例输出Z行,按升序给出每个字符的编码(格式:原始符号->编码)
- 原始符号用0到Z-1的整数表示
示例输入输出:
输入:
3
3
2
10011
4
2
000111010
19
10
01234678950515253545556575859
输出:
0->10
1->0
2->11
0->00
1->011
2->1
3->010
0->0
1->1
2->2
3->3
4->4
5->6
6->7
7->8
8->9
9->50
10->51
11->52
12->53
13->54
14->55
15->56
16->57
17->58
18->59