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. 影响Cache的几个HTTP头信息【转载http://hi.baidu.com/feilala_fly/item/f79eca08fbf389026c9048a7】

    Http的Cache机制总共有4个组成部分: Cache-Control.Last-Modified(If-Modified-Since).Etag(If-None-Match) .Expires 服 ...

  2. ACM学习历程—BestCoder Round #75

    1001:King's Cake(数论) http://acm.hdu.edu.cn/showproblem.php?pid=5640 这题有点辗转相除的意思.基本没有什么坑点. 代码: #inclu ...

  3. java ----一个函数传回多个值的总结

    java 一个函数如何返回多个值 参考方法: 1.使用map返回值:这个方法问题是,你并不知道如何返回值的key是什么,只能通过doc或者通过源代码来查看. 2.传入一个引用进去,修改引用的属性值.问 ...

  4. 使用python对文件夹里面所有代码行数进行统计。

    统计目录下所有的代码个数和总行数. # -*- coding: utf-8 -*- # @Author : ydf import json import os from pathlib import ...

  5. Mac 远程连接Linux服务器及上传、下载命令

    1.使用ssh命令连接远程服务器主机 1.不设置端口,默认就是22 ssh root@192.168.18.129 1.1.设置端口例: ssh -p 22 root@192.168.18.1292. ...

  6. java数据库连接模板代码通用收集

    package org.lxh.dbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLE ...

  7. github 分支操作

    1.查看分支 1.查看本地分支 使用git branch命令,如下: $ git branch * master *标识的是你当前所在的分支. 2.查看远程分支 命令如下: git branch -r ...

  8. 安装yum在ubnutu上

    安装yum在ubnutu上1:首先检测是否安装了build-essential程序包 apt-get install build-essential2.安装yumapt-get install yum ...

  9. WHAT is CPU负载?

    WHAT?? 1.CPU负载都有哪些? cpu负载的定义:在一般情况下可以将单核心cpu的负载看成是一条单行的桥,数字1代表cpu刚好能够处理过来,即桥上能够顺利通过所有的车辆,桥外没有等待的车辆,桥 ...

  10. 8、SRR数据下载https://ftp-trace.ncbi.nlm.nih.gov/sra/sdk/2.8.2/

    1.prefetch SRRxxxxxx         -/ncbi/public/sra 2.fastq-dump --split-files xxxxxxsra 3.SRA.SAM以及Fastq ...