05-树9 Huffman Codes (30 分)
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 分)的更多相关文章
- pta5-9 Huffman Codes (30分)
5-9 Huffman Codes (30分) In 1953, David A. Huffman published his paper "A Method for the Const ...
- 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 ...
- 05-树9 Huffman Codes (30 分)
In 1953, David A. Huffman published his paper "A Method for the Construction of Minimum-Redunda ...
- pat树之专题(30分)
(好好复习是王道) 1115. Counting Nodes in a BST (30) 分析:简单题——将bst树构造出来,然后给每个节点打上高度.最后求出树的高度.然后count树高的节点数加上树 ...
- 05-树9 Huffman Codes (30 分)
In 1953, David A. Huffman published his paper "A Method for the Construction of Minimum-Redunda ...
- 05-树9 Huffman Codes(30 分)
In 1953, David A. Huffman published his paper "A Method for the Construction of Minimum-Redunda ...
- PAT 甲级1057 Stack (30 分)(不会,树状数组+二分)*****
1057 Stack (30 分) Stack is one of the most fundamental data structures, which is based on the prin ...
- Huffman codes
05-树9 Huffman Codes(30 分) In 1953, David A. Huffman published his paper "A Method for the Const ...
- 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 Wi assigne ...
随机推荐
- 为什么都说UX / UI设计师是最佳工作?
以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 你将成为永远热爱自己工作的人,做着自己喜欢的工作还能得到相应的成果和报酬,就好似在度带薪年假一般,何 ...
- JVM 垃圾回收- 转载 知识碎片
最近关注了一下垃圾回收的问题,想了解一下JVM 关于方法区的垃圾回收机制,找了几篇文章,不同的文章从不同角度讲述了一下,嗯... 拼凑起来 记录一下, 有些未验证正确性... JVM 方法区 当JVM ...
- io.fabric8.kubernetes对pv和pvc的增删查改
1.新建maven项目k8stest,pom.xml如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns: ...
- (DP)To The Max --HDU -- 1081
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1081 这道题使用到的算法是:预处理+最大连续子串和 如果会做最大连续子串和,那么理解这题就相对简单一些, ...
- leancloud 云引擎
可以部署网站的云端,云代码的升级版.
- Linux 批量管理工具
pssh/pscp(Python) ansible(Python) saltstack(Python) chef puppet(Ruby) fabric(Python)
- Eclipse中Tomcat的配置及简单例子
Eclipse中Tomcat的配置及简单例子 Eclipse中Tomcat的配置是很简单的一个工作 一. 工具下载 Eclipse,最新版的eclipse为Mars版本.下载地址为: http://w ...
- (zxing.net)一维码UPC A的简介、实现与解码
一.简介 UPC(Universal Product Code)码是最早大规模应用的条码,其特性是一种长度固定.连续性的条 码,目前主要在美国和加拿大使用,由于其应用范围广泛,故又被称万用条码. U ...
- asp.net mvc部分视图的action中获取父级视图信息
RouteData.DataTokens["ParentActionViewContext"]中包含了父级视图的相关信息,如路由等 public ActionResult Chil ...
- sqlcmd 执行SQL语句或没有足够的内存来执行脚本
win+r命令提示框里面输入cmd sqlcmd -S . -U username -P password -d database -i url -S 数据库地址 -U 登录名称 -P 密码 -d 数 ...