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. laravel中hasOne、HasMany、belongsTo、belongsToMany的ORM方法

    在laravel5.4框架中,使用ORM关联方法,一对一,一对多 一对一关系,代码: user表为主表,需要向下找关联表的字段用hasOne video表为关联表,需要向上找关联表的字段用belong ...

  2. C#实现将字符串转换成代码并执行

    我们在写JavaScript程序的时候,有一个函数很有趣,eval(),这个方法非常有趣,他可以编译他内部的字符串,并将字符串按照JS代码执行,例如eval(‘alert(“message”)’),执 ...

  3. 类例程_c#战斗程序(窗体版)

    战士类代码: class Fight { String name; int attack, speed, crit, armor;// 生命.攻击力,攻速,暴击,护甲 public int life; ...

  4. springboot 全局异常捕获,异常流处理业务逻辑

    前言 上一篇文章说到,参数校验,往往需要和全局的异常拦截器来配套使用,使得返回的数据结构永远是保持一致的.参数异常springboot默认的返回结构: { "timestamp": ...

  5. Mycat分布式数据库架构解决方案--Mycat实现数据库分表

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 准备工 ...

  6. SSM之Mybatis整合及使用

    SSM 在ss基础上加进行整合Mybatis(applicationContext.xml中添加配置),并添加分页拦截器(添加mybatis分页拦截器),并用generator动态生成到层. 构建基础 ...

  7. Android SDK版本号与API Level 的对应关系及发布时间(更新到28)

    Android SDK版本号与API Level 的对应关系及发布时间 平台版本号 API 级别 VERSION_CODE(代号) 发布时间 Android 9.0 28 Pie/P(馅饼) 2018 ...

  8. JS案例 - 城市三级联动

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. RedHat 6 安装 MySQL 5.5 流程记录及相关问题解决方案

    目录 1. RedHat 中 使用 yum 方式安装 MySQL 2. 安装过程中遇到的问题 1. RedHat 中 使用 yum 方式安装 MySQL 1.1 删除系统自带的 MySQL 5.1 r ...

  10. 大数据:Hadoop(简介)

    一.简介 定义:开源的,做分布式存储与分布式计算的平台: 功能:搭建大型数据仓库,对PB级数据进行存储.处理.分析.统计等业务:(如日志分析.数据挖掘) Hadoop工作模块 Common:提供框架和 ...