给定一段文字,如果我们统计出字母出现的频率,是可以根据哈夫曼算法给出一套编码,使得用此编码压缩原文可以得到最短的编码总长。然而哈夫曼编码并不是唯一的。例如对字符串"aaaxuaxz",容易得到字母 'a'、'x'、'u'、'z' 的出现频率对应为 4、2、1、1。我们可以设计编码 {'a'=0, 'x'=10, 'u'=110, 'z'=111},也可以用另一套 {'a'=1, 'x'=01, 'u'=001, 'z'=000},还可以用 {'a'=0, 'x'=11, 'u'=100, 'z'=101},三套编码都可以把原文压缩到 14 个字节。但是 {'a'=0, 'x'=01, 'u'=011, 'z'=001} 就不是哈夫曼编码,因为用这套编码压缩得到 00001011001001 后,解码的结果不唯一,"aaaxuaxz" 和 "aazuaxax" 都可以对应解码的结果。本题就请你判断任一套编码是否哈夫曼编码。

输入格式:

首先第一行给出一个正整数 N(2≤N≤63),随后第二行给出 N 个不重复的字符及其出现频率,格式如下:

c[1] f[1] c[2] f[2] ... c[N] f[N]

其中c[i]是集合{'0' - '9', 'a' - 'z', 'A' - 'Z', '_'}中的字符;f[i]c[i]的出现频率,为不超过 1000 的整数。再下一行给出一个正整数 M(≤1000),随后是 M 套待检的编码。每套编码占 N 行,格式为:

c[i] code[i]

其中c[i]是第i个字符;code[i]是不超过63个'0'和'1'的非空字符串。

输出格式:

对每套待检编码,如果是正确的哈夫曼编码,就在一行中输出"Yes",否则输出"No"。

注意:最优编码并不一定通过哈夫曼算法得到。任何能压缩到最优长度的前缀编码都应被判为正确。

输入样例:

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

输出样例:

Yes
Yes
No
No
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string>
void sort(int arr[], int Left, int Right) {//冒泡排序int flag = 1;for (int i = Left; i <= Right && flag; i++) {flag = 0;for (int j = Left; j < Right - i + Left; j++) {if (arr[j] > arr[j + 1]) {flag = 1;int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}
int main() {int N;char c;scanf("%d", &N);int Parent_Sum = 0, Huffqueue[64] = { 0 }, top = 0, f[64] = { 0 };for (int i = 0; i < N; i++) {getchar();scanf("%c %d", &c, &Huffqueue[top++]);f[top - 1] = Huffqueue[top - 1];}int head = 0;sort(Huffqueue, head, N - 1);while (top != head + 1) {//判断队列是否只剩一个元素int n1 = Huffqueue[head];Huffqueue[head] = 0;int n2 = Huffqueue[++head];Huffqueue[head] = 0;Huffqueue[head] = n1 + n2;sort(Huffqueue, head, N - 1);Parent_Sum += n1 + n2;}int M;scanf("%d", &M);for (int k = 0; k < M; k++) {char code[64][63] = { 0 };int WPL = 0;for (int i = 0; i < N; i++) {getchar();scanf("%c %s", &c, code[i]);WPL += (int)strlen(code[i]) * f[i];}if (WPL != Parent_Sum) {printf("No\n");}else if (Parent_Sum == WPL) {int flag = 1;for (int i = 0; i < N; i++) {for (int j = 0; j < N & j != i; j++) {if (strlen(code[i]) <= strlen(code[j]) && strncmp(code[i], code[j], strlen(code[i]))==0) {flag = 0;break;}else if (strlen(code[i]) > strlen(code[j]) && strncmp(code[i], code[j], strlen(code[j]))==0) {flag = 0;break;}}if (!flag)break;}if (!flag)printf("No\n");elseprintf("Yes\n");}}system("pause");return 0;
}

7-63 哈夫曼编码 (30 分)相关推荐

  1. 7-1 哈夫曼编码 (30分)

    文章目录 7-1 哈夫曼编码 (30分) 输入格式: 输出格式: 输入样例: 输出样例: 题解 代码 7-1 哈夫曼编码 (30分) 给定一段文字,如果我们统计出字母出现的频率,是可以根据哈夫曼算法给 ...

  2. 7-2 哈夫曼编码 (30 分)

    2019.12.15更正Best函数样本数据初始化问题并且对代码添加了注释; 2020.11.17更正:题目说明: 原贴发于2019.11.22 注意:本题不是哈夫曼编码裸题,学习哈夫曼编码的同学不要 ...

  3. 进阶实验4-3.5 哈夫曼编码 (30 分)

    仅供参考 #include <iostream> #include <cstdio> #include <queue> #include <string> ...

  4. 哈夫曼树哈夫曼编码(已知A,B,C,D,E,F,G的概率分别为:17,25,50,67,40,60,30.画出其哈夫曼树和每个字符对应的哈夫曼编码)

    [也可以哈夫曼树与最优不等长编码] 已知A,B,C,D,E,F,G的概率分别为:17,25,50,67,40,60,30.画出其哈夫曼树和每个字符对应的哈夫曼编码.

  5. 【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

    1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R ...

  6. JPEG霍夫曼编码教程

    转译自:https://www.impulseadventure.com/photo/jpeg-huffman-coding.html 量化后,霍夫曼/熵编码是JPEG压缩文件大小节省的重要因素之一. ...

  7. 递归求解并生成哈夫曼编码的代码实现

    一开始我用的三叉链表来生成哈夫曼编码,这一点都不递归.后来我想起了一度被递归统治地恐惧,我发现哈夫曼树不仅编码可以简单的用递归来求,树的WPL也可以. 改善后的递归版本如下,虽然WPL也可以通过递归来 ...

  8. labview霍夫曼编码_哈夫曼编解码压缩解压文件—C++实现

    前言 哈夫曼编码是一种贪心算法和二叉树结合的字符编码方式,具有广泛的应用背景,最直观的是文件压缩.本文主要讲述如何用哈夫曼编解码实现文件的压缩和解压,并给出代码实现. 哈夫曼编码的概念 哈夫曼树又称作 ...

  9. 贪心算法(Greedy Algorithm)之霍夫曼编码

    文章目录 1. 贪心算法 2. 应用 2.1 找零钱 2.2 区间覆盖 2.3 霍夫曼编码 霍夫曼编码完整代码 1. 贪心算法 我们希望在一定的限制条件下,获得一个最优解 每次都在当前的标准下做出当下 ...

最新文章

  1. 无法显示验证码去掉html,后台登陆验证码无法显示
  2. View绘制原理 —— 画在哪?
  3. Poj 2186 Popular Cows(Tarjan 强连通缩点)
  4. 7.1 函数的一般形式
  5. golang匿名组合
  6. python 虚拟环境使用
  7. Python Tornado
  8. linux线程一直在增加,在.net core中遇到的奇怪问题:内存与线程数一直增长
  9. MATLAB table数据结构 再篇
  10. mysql表jiayi_MySQL Memory存储引擎:优势及性能测试
  11. Jenkins邮件配置,实现邮件发送策略(可实现每个Job对应不同的发送邮箱)
  12. 安卓连接mysql代码_用Eclipse开发android,怎么连接到数据库,最好有详细程序代码...
  13. powercmd注册码
  14. 激光雷达和毫米波雷达的区别
  15. 【案例实战】餐饮企业分店财务数据分析系统解决方案:业务需求
  16. C语言中意想不到的地方——第七周作业
  17. 阿里云iconfont使用方法
  18. 使用YYLabel编写直播间消息样式
  19. win7右键显示隐藏文件及扩展名
  20. 什么是关联分析?如何利用关联规则做好数据挖掘

热门文章

  1. 如何从官方网站下载jdk1.7?
  2. MES项目导入-案例分析-XC-MES成就飞毛腿的高效与协同
  3. 多个xml文件转coco格式、coco转VOC格式(xml)
  4. QQ新中国象棋棋盘基址--寻找过程
  5. Python dataframe.pivot()用法解析
  6. 图解 Google V8 # 01:V8 是如何执行一段 JavaScript 代码的?
  7. 英语口语312之每日二十个英语单词
  8. 致我们那年青春热血的高考
  9. 忘记密码情况下卸载诺顿杀毒软件的方法(未验证)
  10. html5独立钻石棋,独立钻石跳棋问题的C++实现