5-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 (≤1000), 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<cstdio>
#include<cstring>
#include<iostream>
#include<stack>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
using namespace std;
struct node{
string dight;
int weight;
bool operator<(const node &a) const {//什么情况下优先输出后面那个,这个和sort的刚好相反
if(weight==a.weight){
/*if(dight.length()==a.dight.length()){
return dight.compare(a.dight)>0;
}*/
return dight.length()<a.dight.length();
}
return weight>a.weight;
}
};
node h[];
map<char,int> ha;
int main(){
//freopen("D:\\INPUT.txt","r",stdin);
int n;
scanf("%d",&n);
int i,num,sum;
char cha;
for(i=;i<n;i++){
cin>>cha;
scanf("%d",&ha[cha]);
}
scanf("%d",&num);
while(num--){
sum=;
priority_queue<node> q;
for(i=;i<n;i++){
cin>>cha>>h[i].dight;
//scanf("%s",h[i].dight);
sum+=ha[cha];
h[i].weight=ha[cha];
q.push(h[i]);
}
/*while(!q.empty()){
cout<<q.top().weight<<" "<<q.top().dight<<endl;
q.pop();
}*/
//cout<<num<<" "<<sum<<endl;
node cur,next;
queue<node> qq;
bool can;
while(!q.empty()){
cur=q.top();
q.pop();
can=false;
while(!q.empty()){
next=q.top();
q.pop();
if(cur.dight.length()==next.dight.length()){
if(cur.dight.substr(,cur.dight.length()-)==next.dight.substr(,next.dight.length()-)&&cur.dight[cur.dight.length()-]!=next.dight[next.dight.length()-]){
can=true;
while(!qq.empty()){//还原
q.push(qq.front());
qq.pop();
}
break;
}
else{
qq.push(next);
}
}
else{
break;
}
}
if(can){//找到了
cur.dight=cur.dight.substr(,cur.dight.length()-);
cur.weight+=next.weight;
if(q.empty()){
break;
}
q.push(cur);
}
else{
break;
}
}
if(can&&cur.weight==sum&&!cur.dight.length()){
printf("Yes\n");
}
else{
printf("No\n");
}
}
return ;
}

方法二:

学习网址:http://blog.csdn.net/u013167299/article/details/42244257

1.哈夫曼树法构造的wpl最小。

2.任何01字符串都不是其他字符串的前缀。

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<stack>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
using namespace std;
struct node{
string s;
int count;
};
node p[];
map<char,int> ha;
priority_queue<int,vector<int>,greater<int> > q;//从小到大排
bool check(node *p,int n){
int i,j;
for(i=;i<n;i++){
string temp=p[i].s.substr(,p[i].s.length());
for(j=;j<n;j++){
if(i==j){
continue;
}
if(temp==p[j].s.substr(,p[i].s.length())){//前缀检查
break;
}
}
if(j<n){//不满足要求
return false;
}
}
return true;
}
int main(){
//freopen("D:\\INPUT.txt","r",stdin);
int n,i;
scanf("%d",&n);
char c;
int wpl=;
for(i=;i<n;i++){
cin>>c;
scanf("%d",&ha[c]);
q.push(ha[c]);
}
int cur,next;
while(!q.empty()){
cur=q.top();
q.pop();
if(q.empty()){//最后一次不用做加法
break;
}
cur+=q.top();
q.pop();
wpl+=cur; //cout<<cur<<endl; q.push(cur);
}
//cout<<wpl<<endl;
int num;
scanf("%d",&num);
while(num--){
int sum=;
for(i=;i<n;i++){
cin>>c;
p[i].count=ha[c];
cin>>p[i].s;
sum+=p[i].count*p[i].s.length();
} // cout<<sum<<endl; if(sum==wpl&&check(p,n)){
printf("Yes\n");
}
else{
printf("No\n");
}
}
return ;
}

pta5-9 Huffman Codes (30分)的更多相关文章

  1. 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 ...

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

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

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

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

  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. Huffman codes

    05-树9 Huffman Codes(30 分) In 1953, David A. Huffman published his paper "A Method for the Const ...

  7. PAT 05-树8 Huffman Codes

    以现在的生产力,是做不到一天一篇博客了.这题给我难得不行了,花了两天时间在PAT上还有测试点1没过,先写上吧.记录几个做题中的难点:1.本来比较WPL那块我是想用一个函数实现的,无奈我对传字符串数组无 ...

  8. 05-树9 Huffman Codes

    哈夫曼树 Yes 需满足两个条件:1.HuffmanTree 结构不同,但WPL一定.子串WPL需一致 2.判断是否为前缀码 开始判断用的strstr函数,但其传值应为char *,不能用在strin ...

  9. PTA 07-图5 Saving James Bond - Hard Version (30分)

    07-图5 Saving James Bond - Hard Version   (30分) This time let us consider the situation in the movie ...

随机推荐

  1. Powershell Deploy Service Fabric Application To Local Cluster

    之前写过一篇用 Powershell 部署 Service Fabric Application 到本地集群的随笔,感觉过程有点复杂,这次将流程简化,只需要将应用程序打包,加上配置文件就可以了.   ...

  2. C# System.Timers.Timer定时器的使用和定时自动清理内存应用

    项目比较大有时候会比较卡,虽然有GC自动清理机制,但是还是有不尽人意的地方.所以尝试在项目启动文件中,手动写了一个定时器,定时清理内存,加快项目运行速度. public class Program { ...

  3. 转场动画CALayer (Transition)

    1.将对应UI控件的层调用以下接口即可 1.1 .h文件 // // 文 件 名:CALayer+Transition.h // // 版权所有:Copyright © 2018年 leLight. ...

  4. AppDelegate生命周期回调顺序

    1. 应用初次启动: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDiction ...

  5. php 顺序线性表

    <?php /* * 线性顺序表 ,其是按照顺序在内存进行存储,出起始和结尾以外都是一一连接的(一般都是用一维数组的形式表现) * * GetElem: 返回线性表中第$index个数据元素 * ...

  6. Java内存区域与内存溢出异常---对象的内存布局和对象的访问定位

    对象的内存布局   在HotSpot虚拟机中,对象在内存中的存储布局可以划分为三个区域:对象头,实例数据,对齐填充.   对象头包括两部分信息:第一部分用于存储对象自身的运行时数据,如哈希码,GC分代 ...

  7. kuangbin专题十六 KMP&&扩展KMP HDU3336 Count the string

    It is well known that AekdyCoin is good at string problems as well as number theory problems. When g ...

  8. C. The Fair Nut and String 递推分段形dp

    C. The Fair Nut and String 递推分段形dp 题意 给出一个字符串选择一个序列\({p_1,p_2...p_k}\)使得 对于任意一个\(p_i\) , \(s[p_i]==a ...

  9. mybatis和jdbc分析

    从这个图上可以看出mybatis的整体执行图 jdbc的 mybatis对很多类型进行了转化,减少了开发的量

  10. kindeditor使用记录

    --------------------------资源 百度下载包  kindeditor-4.1.11-zh-CN 解压后根据需要选择asp / asp.net / jsp / php 文件夹之一 ...