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. JavaScript之变量(声明、解析、作用域)

    声明(创建) JavaScript 变量 在 JavaScript 中创建变量通常称为"声明"变量. 一.我们使用 var 关键词来声明变量: var carname; 变量声明之 ...

  2. restFull api接口

    RestFull api接口 前后端分离开发的接口规范 什么是RestFull 是目录比较流行的api设计规范 注:restfull api规范应用场景,前后端分离的项目中 数据接口的现场 例如: / ...

  3. centos7.5内核编译安装

    1.安装依赖 yum -y install gcc bc gcc-c++ ncurses ncurses-devel cmake elfutils-libelf-devel openssl-devel ...

  4. springboot配置tomcat大全

    server.tomcat.accept-count=100 # Maximum queue length for incoming connection requests when all poss ...

  5. Kali 安装tightvncserver

    一.软件说明 a) tightvncserver是一个轻量级,只能建立桌面,不能查看TTY7/TTY1正在显示的桌面,但x11 vnc可以,相比x11vnc 安全传输差一些.反之,x11 vnc:安全 ...

  6. Ansible--Ansible之Roles

    Ansible之Roles Roles介绍 ansible自1.2版本引入的新特性,用于层次性.结构化地组织playbook.roles能够根据层次型结构自动装载变量文件.tasks以及handler ...

  7. CentOS7 开机提示Initial setup of CentOS Linux 7 (Core)

    一.开机以后提示信息如下 二.解决方法 . 输入1,按Enter同意许可协议 . 输入2,按Enter同意许可协议 . 输入q,按Enter退出 . 输入yes,按Enter确定 . 完成重启后即可正 ...

  8. Statefulset:部署有状态的多副本应用

    10.1.什么是Statefulset StatefulSet是Kubernetes提供的管理有状态应用的负载管理控制器API.        特点: 1.具有固定的网络标记(主机名) 2.具有持久化 ...

  9. Android Binder机制彻底梳理二

    根据AIDL了解整体调用流程[重点分析AIDL流程]: 在上一次https://www.cnblogs.com/webor2006/p/11741743.html中我们已经对Android Binde ...

  10. POJ 3322 Bloxorz

    #include<cstring> #include<algorithm> #include<iostream> #include<cstdio> #i ...