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 ...
随机推荐
- Oracle使用中的常规操作总结
写一篇在使用Oracle过程中一些常用的操作,以便于忘记的时候查看 一.创建用户和给用户赋予权限 create user 用户名 identified by 密码; --12c一下版本 create ...
- C# 进程 与 线程
C#多线程和线程池1.0.线程的和进程的关系以及优缺点windows系统是一个多线程的操作系统.一个程序至少有一个进程,一个进程至少有一个线程.进程是线程的容器,一个C#客户端程序开始于一个单独的线程 ...
- 前端1-----A标签 (锚点)
Title 头部,顶端, 点击跳转到id='abc' 1 2 到百度这里,点击跳转百度 3 到这里了 4 alex1 5 6 根据id 从底部到头 根据id='a1' 到指定位置 ...
- 2019-08-02 原生ajax搜索
<html> <meta charset="utf-8"/> <head><title>搜索页</title></ ...
- C/ C++ 快速上手
C++ 快速上手 (一)https://www.cnblogs.com/cosmo89929/archive/2012/12/22/2828745.html C++ 快速上手 (二)https://w ...
- 从CMS到G1:LinkedIn个人主页调优实战
本文转载自公众号:阿飞的博客,阅读大约需要13分钟.阿飞是我认识几年的好友,对技术有很强的专研精神,跟他讨论GC问题的时候一些观点都很深刻. LinkedIn中的个人主页是访问量最多的页面之一,它允许 ...
- 【恢复】Redo日志文件丢失的恢复
第一章 Redo文件丢失的恢复 1.1 online redolog file 丢失 联机Redo日志是Oracle数据库中比较核心的文件,当Redo日志文件异常之后,数据库就无法正常启动,而且有丢 ...
- Apache Zookeerper搭建
08-Apache Zookeerper--概述和集群相关概念(主从.主备) 01) zookeeper的介绍 01) 分布式协调服务的开源框架,主要解决分布式集群中应用系统间的一 ...
- Linux普通用户登录后,命令行提示:-bash-4.1$ ,原因分析及解决
原文 有时候在使用用户登陆Linux系统时会发现,命令行提示符成了:-bash-4.1$,不显示用户名,路径信息. 原因:用户家目录里面与环境变量有关的文件被删除所导致的 也就是这俩文件:.bash_ ...
- 服务器架构前面加了防火墙,Nginx如何获取客户端真实ip???
在大部分实际业务场景中,网站访问请求并不是简单地从用户(访问者)的浏览器直达网站的源站服务器,中间可能经过所部署的CDN.高防IP.WAF等代理服务器.例如,网站可能采用这样的部署架构:用户 > ...