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 <= N <= 63), 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 = ; typedef struct TreeNode* Tree;
struct TreeNode
{
Tree left,right;
int weight;
}; typedef struct HeapNode* Heap;
struct HeapNode
{
TreeNode Data[maxn];
int size;
}; int n,m;
int w[maxn];
char ch[maxn];
int codelen;
int cnt2,cnt0; Tree creatTree();
Heap creatHeap();
void Insert(Heap H, TreeNode T);
Tree Huffman(Heap H);
Tree Delete(Heap H);
int WPL(Tree T, int depth);
bool Judge();
void JudgeTree(Tree T); 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,);
//printf("%d\n",codelen); cin >> m;
while (m--)
{
if (Judge())
{
printf("Yes\n");
}
else
{
printf("No\n");
}
} return ;
} Tree creatTree()
{
Tree T = new TreeNode;
T->left = T->right = NULL;
T->weight = ;
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 (; H->Data[i/].weight > T.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 parent,child;
TreeNode Tmp = 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 > Tmp.weight)
{
break;
}
H->Data[parent] = H->Data[child];
}
H->Data[parent] = Tmp;
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;
int wgh; for (int i = ; i < n; i++)
{
cin >> s1 >> s2; if (strlen(s2) > n)
{
return ;
} int j;
for (j = ; ch[j] != s1[]; 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 ;
}
cnt0 = cnt2 = ;
JudgeTree(T); if (cnt2 != cnt0-)
{
return ;
}
if (codelen == WPL(T,))
{
return ;
}
else
{
return ;
}
} void JudgeTree(Tree T)
{
if (T)
{
if (!T->left && !T->right)
{
cnt0++;
}
else if(T->left && T->right)
{
cnt2++;
}
else
{
cnt0 = ;
} 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 ...
- 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 ...
- 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 ...
随机推荐
- 华为 S5700 交换机 批量修改端口方法
常常在配置交换机端口的时候需要将多个端口设置为相同的配置,当时各端口逐一去配置不仅慢,而且容易出错,这个时候就需要对端口进行批量设置,不仅快捷,而且避免了反复输出容易出错的情况.不同系列.不同版本交换 ...
- Vue,Javascript--时间戳的操作
new Date(parseInt(data.substring(6, data.length - 2))).toLocaleDateString(); 我这里的data记得替换成你的数据,在过滤器中 ...
- docker-compose进阶
笔者在前文<Docker Compose 简介>和<Dcoker Compose 原理>两篇文章中分别介绍了 docker compose 的基本概念以及实现原理.本文我们将继 ...
- Lumen 使用事件需要注意的事项
Lumen 版本 5.2 参考手册 laravel event 需要注意的事项 如果是第一次在lumen下使用事件,需要修改bootstrap\app.php文件 添加对EventServicePro ...
- 分布式事务:Saga模式
1 Saga相关概念 1987年普林斯顿大学的Hector Garcia-Molina和Kenneth Salem发表了一篇Paper Sagas,讲述的是如何处理long lived transac ...
- Django:RestFramework之-------分页
9.分页操作 分页,看第n页,每页显示n条数据 分页,在n个位置,向后查看n条数据. 加密分页,上一页和下一页 1.基于PageNumberPagination分页 1.路由: url(r'^(?P& ...
- [JS设计模式]:观察者模式(即发布-订阅者模式)(4)
简介 观察者模式又叫发布---订阅模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 举一个现实生活中的例子,例如小 ...
- js中 json对象与json字符串相互转换的几种方式
以下总结js中 json对象与json字符串相互转换的几种方式: 一.JSON对象转化为JSON字符串 1.使用JSON.stringify()方法进行转换 该方法不支持较老版本的IE浏览器,比如:i ...
- 记录下Hbuilder 打包IOS发布时 总是提示错误:ios prifile文件与私钥证书匹配 的问题
最近两天,新的APP准备要上线,然后打包正式发布版 时,总是提示不匹配 证书照hbuilder里面的文档 一样也不行,然后百度了N种方法,都是不行,而且也比较少搜索到相关问题. 后来都是谷歌了下,找到 ...
- 在iOS平台使用ffmpeg解码h264视频流
来源:http://www.aichengxu.com/view/37145 在iOS平台使用ffmpeg解码h264视频流,有需要的朋友可以参考下. 对于视频文件和rtsp之类的主流视频传输协议,f ...