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;
const int maxn = ; int n,m;
int wgh;
int cnt1,cnt2;
int w[maxn];
char ch[maxn];
int codelen; typedef struct TreeNode* Tree;
struct TreeNode{
int weight;
Tree Left,Right;
};
typedef struct HeapNode* Heap;
struct HeapNode{
TreeNode Data[maxn];
int size;
}; Tree creatTree();
Heap creatHeap();
void Insert(Heap H,TreeNode T);
Tree Delete(Heap H);
Tree Huffman(Heap H);
int WPL(Tree T,int depth);
void JudgeTree(Tree T);
bool Judge(); int main(){
cin >> n; Tree T = creatTree();
Heap H = creatHeap(); for(int 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 >> m;
while(m--){
if(Judge()) printf("Yes\n");
else printf("No\n");
} return ;
} Tree creatTree(){
Tree T = new TreeNode;
T->weight = ;
T->Left = T->Right = NULL;
return T;
} Heap creatHeap(){
Heap H = new HeapNode;
H->Data[].weight = -;
H->size = ;
return H;
} void Insert(Heap H,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 Huffman(Heap H){
Tree T = creatTree();
while(H->size != ){
T->Left = Delete(H);
T->Right = Delete(H);
T->weight = T->Left->weight + T->Right->weight;
Insert(H,*T);
}
T = Delete(H);
return T;
} Tree Delete(Heap H){
int child,parent;
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;
} 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+);
} bool Judge(){
char s1[maxn],s2[maxn];
bool flag = true;
Tree T = creatTree();
Tree pt = NULL;
for(int i = ; i < n; i++){
cin >> s1 >> s2;
if(strlen(s2) > n) return ;
int j;
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 = false;
if(!s2[j+]){
if(pt->Left || pt->Right) flag = false;
else pt->weight = wgh;
}
}
}
if(!flag) return ;
cnt1 = cnt2 = ;
JudgeTree(T);
if(cnt1 != cnt2 + ) return ;
if(codelen == WPL(T,)) return ;
else return ;
} void JudgeTree(Tree T){
if(T){
if(T->Right&&T->Left) cnt2++;
else if(!T->Right && !T->Left) cnt1++;
else cnt1 = ;
JudgeTree(T->Left);
JudgeTree(T->Right);
}
}

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. oracle 查询死锁

    --查询死锁 select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked ...

  2. c#解决Nullable类型的转换 (包含DataContract的序列化和反序列化以及 该例子应用在反射属性setvalue的时候有用)

    using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Reflect ...

  3. 16 Finding a Protein Motif

    Problem To allow for the presence of its varying forms, a protein motif is represented by a shorthan ...

  4. 网络中的A、B、C类地址

    1.A类ip地址(1.0.0.0到126.255.255.255) A类地址只有第一个8位表示网络地址,最高位一定为0,所以A类地址的网络号范围可以为:64+32+16+8+4+2+1=127,也就是 ...

  5. Hadoop中Writable类之二

    1.ASCII.Unicode.UFT-8 在看Text类型的时候,里面出现了上面三种编码,先看看这三种编码: ASCII是基于拉丁字母的一套电脑编码系统.它主要用于显示现代英语和其他西欧语言.它是现 ...

  6. canvas里调用getImageData的报security的问题

    canvas元素支持绘制任意图片元素: var ctx = document.getElementById("canvas").getContext("2d") ...

  7. BOM Open Interface. Import Bills and Routings 无法打开

    问题: 最近要做一些关于BOM的接口问题,用自己装好的 VM Linux Oracle EBS R12 Vision详细研究下关于BOM的 Open Interface: BOM.Substitute ...

  8. Oracle EBS Add Responsibility to User by the Responsibility reference of Other User.

    Oracle EBS 11i Add Responsibility to User by the Responsibility reference of Other User. Warning: R1 ...

  9. pro1

    #include<iostream> using namespace std; int main(void) { int i,a[],sum; cin>>i; for(i=0; ...

  10. Mysql部署

    1. 下载 Mysql 版本为: mysql-5.6.43-linux-glibc2.12-x86_64.tar.gz (注意:下载二进制文件)  存放位置: /usr/local 2. 检查机器上 ...