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 分)的更多相关文章

  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. pat树之专题(30分)

    (好好复习是王道) 1115. Counting Nodes in a BST (30) 分析:简单题——将bst树构造出来,然后给每个节点打上高度.最后求出树的高度.然后count树高的节点数加上树 ...

  4. 05-树9 Huffman Codes (30 分)

    In 1953, David A. Huffman published his paper "A Method for the Construction of Minimum-Redunda ...

  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. 华为 S5700 交换机 批量修改端口方法

    常常在配置交换机端口的时候需要将多个端口设置为相同的配置,当时各端口逐一去配置不仅慢,而且容易出错,这个时候就需要对端口进行批量设置,不仅快捷,而且避免了反复输出容易出错的情况.不同系列.不同版本交换 ...

  2. Vue,Javascript--时间戳的操作

    new Date(parseInt(data.substring(6, data.length - 2))).toLocaleDateString(); 我这里的data记得替换成你的数据,在过滤器中 ...

  3. docker-compose进阶

    笔者在前文<Docker Compose 简介>和<Dcoker Compose 原理>两篇文章中分别介绍了 docker compose 的基本概念以及实现原理.本文我们将继 ...

  4. Lumen 使用事件需要注意的事项

    Lumen 版本 5.2 参考手册 laravel event 需要注意的事项 如果是第一次在lumen下使用事件,需要修改bootstrap\app.php文件 添加对EventServicePro ...

  5. 分布式事务:Saga模式

    1 Saga相关概念 1987年普林斯顿大学的Hector Garcia-Molina和Kenneth Salem发表了一篇Paper Sagas,讲述的是如何处理long lived transac ...

  6. Django:RestFramework之-------分页

    9.分页操作 分页,看第n页,每页显示n条数据 分页,在n个位置,向后查看n条数据. 加密分页,上一页和下一页 1.基于PageNumberPagination分页 1.路由: url(r'^(?P& ...

  7. [JS设计模式]:观察者模式(即发布-订阅者模式)(4)

    简介 观察者模式又叫发布---订阅模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 举一个现实生活中的例子,例如小 ...

  8. js中 json对象与json字符串相互转换的几种方式

    以下总结js中 json对象与json字符串相互转换的几种方式: 一.JSON对象转化为JSON字符串 1.使用JSON.stringify()方法进行转换 该方法不支持较老版本的IE浏览器,比如:i ...

  9. 记录下Hbuilder 打包IOS发布时 总是提示错误:ios prifile文件与私钥证书匹配 的问题

    最近两天,新的APP准备要上线,然后打包正式发布版 时,总是提示不匹配 证书照hbuilder里面的文档 一样也不行,然后百度了N种方法,都是不行,而且也比较少搜索到相关问题. 后来都是谷歌了下,找到 ...

  10. 在iOS平台使用ffmpeg解码h264视频流

    来源:http://www.aichengxu.com/view/37145 在iOS平台使用ffmpeg解码h264视频流,有需要的朋友可以参考下. 对于视频文件和rtsp之类的主流视频传输协议,f ...