In 1953, David A. Huffman published his paper "A Method for the Construction of Minimum-Redundancy Codes", and hence printed his name in the history of computer science. As a professor who gives the final exam problem on Huffman codes, I am encountering a big problem: the Huffman codes are NOT unique. For example, given a string "aaaxuaxz", we can observe that the frequencies of the characters 'a', 'x', 'u' and 'z' are 4, 2, 1 and 1, respectively. We may either encode the symbols as {'a'=0, 'x'=10, 'u'=110, 'z'=111}, or in another way as {'a'=1, 'x'=01, 'u'=001, 'z'=000}, both compress the string into 14 bits. Another set of code can be given as {'a'=0, 'x'=11, 'u'=100, 'z'=101}, but {'a'=0, 'x'=01, 'u'=011, 'z'=001} is NOT correct since "aaaxuaxz" and "aazuaxax" can both be decoded from the code 00001011001001. The students are submitting all kinds of codes, and I need a computer program to help me determine which ones are correct and which ones are not.

Input Specification:

Each input file contains one test case. For each case, the first line gives an integer N (2), then followed by a line that contains all the N distinct characters and their frequencies in the following format:

c[1] f[1] c[2] f[2] ... c[N] f[N]

where c[i] is a character chosen from {'0' - '9', 'a' - 'z', 'A' - 'Z', '_'}, and f[i] is the frequency of c[i] and is an integer no more than 1000. The next line gives a positive integer M (≤), then followed by M student submissions. Each student submission consists of N lines, each in the format:

c[i] code[i]

where c[i] is the i-th character and code[i] is an non-empty string of no more than 63 '0's and '1's.

Output Specification:

For each test case, print in each line either "Yes" if the student's submission is correct, or "No" if not.

Note: The optimal solution is not necessarily generated by Huffman algorithm. Any prefix code with code length being optimal is considered correct.

Sample Input:

7
A 1 B 1 C 1 D 3 E 3 F 6 G 6
4
A 00000
B 00001
C 0001
D 001
E 01
F 10
G 11
A 01010
B 01011
C 0100
D 011
E 10
F 11
G 00
A 000
B 001
C 010
D 011
E 100
F 101
G 110
A 00000
B 00001
C 0001
D 001
E 00
F 10
G 11

Sample Output:

Yes
Yes
No
No
#include<iostream>
#include<cstring>
using namespace std;
#define maxn 70
int N,codelen,cnt1,cnt2,w[maxn];
char ch[maxn];
typedef struct TreeNode* Tree;
struct TreeNode{
int weight;
Tree Left,Right;
};
typedef struct HeapNode* Heap;
struct HeapNode{
struct TreeNode Data[maxn];
int size;
}; Tree creatTree(){
Tree T;
T = new struct TreeNode;
T->weight = ;
T->Left = T->Right = NULL;
return T;
} Heap creatHeap(){
Heap H;
H = new struct HeapNode;
H->Data[].weight = -;
H->size = ;
return H;
} void Insert(Heap H,struct TreeNode T){
int i = ++H->size;
for(; T.weight < H->Data[i/].weight; i /= )
H->Data[i] = H->Data[i/];
H->Data[i] = T;
} Tree Delete(Heap H){
int child,parent;
struct TreeNode Temp = H->Data[H->size--];
Tree T = creatTree();
*T = H->Data[];
for(parent = ; * parent <= H->size; parent = child){
child = * parent;
if(child < H->size && H->Data[child].weight > H->Data[child+].weight)
child++;
if(H->Data[child].weight > Temp.weight) break;
H->Data[parent] = H->Data[child];
}
H->Data[parent] = Temp;
return T;
} Tree Huffman(Heap H){
Tree T = creatTree();
while(H->size != ){
T->Left = Delete(H);
T->Right = Delete(H);
T->weight = T->Right->weight + T->Right->weight;
Insert(H,*T);
}
T = Delete(H);
return T;
} int WPL(Tree T,int depth){
if(!T->Left && !T->Right) return(depth*T->weight);
else return WPL(T->Left,depth+)+WPL(T->Right,depth+);
} void JudgeTree(Tree T){
if(T){
if(T->Right && T->Left) cnt2++;
else if(!T->Left && !T->Right) cnt1++;
else cnt1 = ;
JudgeTree(T->Left);
JudgeTree(T->Right);
}
} int Judge(){
int i,j,wgh,flag = ;;
char s1[maxn],s2[maxn];
Tree T = creatTree(), pt = NULL;
for(i = ; i < N; i++){
cin >> s1 >> s2;
if(strlen(s2) > N) return ;
for(j = ; s1[] != ch[j]; j++); wgh = w[j];
pt = T;
for(j = ; s2[j] ; j++){
if(s2[j] == ''){
if(!pt->Left) pt->Left = creatTree();
pt = pt->Left;
}
if(s2[j] == ''){
if(!pt->Right) pt->Right = creatTree();
pt = pt->Right;
}
if(pt->weight) flag = ;
if(!s2[j+]){
if(pt->Left || pt->Right) flag = ;
else pt->weight = wgh;
}
}
}
if(flag == ) return ;
cnt1 = cnt2 = ;
JudgeTree(T);
if(cnt1 != cnt2 + ) return ;
if(codelen == WPL(T,)) return ;
else return ;
} int main(){
int i,n;
Tree T;
Heap H;
T = creatTree();
H = creatHeap();
cin >> N;
for(i = ; i < N; i++){
getchar();
cin >> ch[i] >> w[i];
H->Data[H->size].Left = H->Data[H->size].Right = NULL;
T->weight = w[i];
Insert(H,*T);
}
T = Huffman(H);
codelen = WPL(T,);
cin >> n;
while(n--){
if(Judge()) cout<< "Yes" << endl;
else cout << "No" << endl;
}
return ;
}

05-树9 Huffman Codes (30 分)的更多相关文章

  1. pta5-9 Huffman Codes (30分)

    5-9 Huffman Codes   (30分) In 1953, David A. Huffman published his paper "A Method for the Const ...

  2. PTA 05-树9 Huffman Codes (30分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/671 5-9 Huffman Codes   (30分) In 1953, David ...

  3. 05-树9 Huffman Codes (30 分)

    In 1953, David A. Huffman published his paper "A Method for the Construction of Minimum-Redunda ...

  4. pat树之专题(30分)

    (好好复习是王道) 1115. Counting Nodes in a BST (30) 分析:简单题——将bst树构造出来,然后给每个节点打上高度.最后求出树的高度.然后count树高的节点数加上树 ...

  5. 05-树9 Huffman Codes (30 分)

    In 1953, David A. Huffman published his paper "A Method for the Construction of Minimum-Redunda ...

  6. 05-树9 Huffman Codes(30 分)

    In 1953, David A. Huffman published his paper "A Method for the Construction of Minimum-Redunda ...

  7. PAT 甲级1057 Stack (30 分)(不会,树状数组+二分)*****

    1057 Stack (30 分)   Stack is one of the most fundamental data structures, which is based on the prin ...

  8. Huffman codes

    05-树9 Huffman Codes(30 分) In 1953, David A. Huffman published his paper "A Method for the Const ...

  9. PAT 甲级 1053 Path of Equal Weight (30 分)(dfs,vector内元素排序,有一小坑点)

    1053 Path of Equal Weight (30 分)   Given a non-empty tree with root R, and with weight W​i​​ assigne ...

随机推荐

  1. 2017-2018-1 20179215《Linux内核原理与分析》第八周作业

    实验:ELF文件格式与程序的编译链接 一.可执行文件的创建  从源代码到可执行程序所要经历的过程概述:  源代码(.c .cpp .h)经过c预处理器(cpp)后生成.i文件,编译器(cc1.cc1p ...

  2. 每天一个linux命令(6):rm命令

    版权声明更新:2017-05-10博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1文章介绍 本文介绍了Linux下面的rm命令. 2 开 ...

  3. 使用 Python 发送短信?

    上回食行生鲜签到,我们说到怎么把签到结果发出来,于是就找到了 Twilio. Twilio 是一个位于加利福尼亚的云通信(PaaS)公司,致力于为开发者提供通讯模块的 API.由于 Twilio 为试 ...

  4. 【Google】循环字符串里面的独立子串

    转载自九章算法(地址) 题目: 假设s是一个无限循环的字符串”abcdefghijklmnopqrstuvwxyz”,s就是一个”...zabcdefghijklmnopqrstuvwxyza...” ...

  5. npm in macbook

    打开终端,试了很多次 npm install anywhere -g,结果还是报错,大概就说没权限. 所以,才想起之前看过的博客中,提到用sudo去执行. 终于,没问题了! 如果npm install ...

  6. [转]JS的内存泄露处理

    问题: 1.给DOM对象添加的属性是一个对象的引用.范例: var MyObject = {}; document.getElementByIdx_x('myDiv').myProp = MyObje ...

  7. 分享一个js技巧!判断一个变量chat_websocket是否存在。

    注意!!! 判断一个变量chat_websocket是否存在:if( "undefined" == typeof(chat_websocket) || null == chat_w ...

  8. JavaScript高级程序设计学习笔记第十五章--使用Canvas绘图

    一.基本用法 1.要使用<canvas>元素,必须先设置其 width 和 height 属性,指定可以绘图的区域大小.能通过 CSS 为该元素添加样式,如果不添加任何样式或者不绘制任何图 ...

  9. mysql四个默认数据库

    1.Master数据库  Master数据库记录了Sqlserver所有的服务器级系统信息,所有的注册帐户和密码,以及所有的系统设置信息,还记录了所有用户定义数据库的存储位置和初始化信息. 2.Tem ...

  10. 10个C语言经典

    1.计算Fibonacci数列Fibonacci数列又称斐波那契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.C语言实现的代码如下: /* t3ing Fibonac ...