PTA哈夫曼编码
题意:
- 给定每个单词出现的频率,给出一套编码,判断是否满足哈夫曼编码。
题解:
- 通过单词出现的频率计算wpl。可以通过c++的stl优先队列快速处理。
- 然后计算编码的wpl是否满足,以及是否存在编码前缀嵌套的情况。
代码
#include <bits/stdc++.h>
using namespace std;
int const N = 65;
typedef pair<char,int>pii;
pii a[N];
string s[N];
map<char,int>mp;
int n;
priority_queue<int,vector<int>,greater<int> >q; //最小堆
int getwpl(){
int wpl = 0;
while(q.size() > 1){
int x = q.top(); q.pop();
int y = q.top(); q.pop();
wpl += (x + y);
q.push(x + y);
}
q.pop();
return wpl;
}
bool isprefix(){
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
if(s[i].length() == s[j].length() && s[i] == s[j]) return false;
if(s[i].length() < s[j].length()
&& s[j].substr(0,s[i].length()) == s[i]) return false;
if(s[j].length() < s[i].length()
&& s[i].substr(0,s[j].length()) == s[j]) return false;
}
}
return true;
}
bool judge(int wpl){
int weight = 0;
for(int i=1;i<=n;i++){
char x;
cin>>x>>s[i];
weight += mp[x] * s[i].length();
}
if(wpl != weight) return false;
if(!isprefix()) return false;
return true;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
char c;
int x;
scanf(" %c%x",&c,&x);
mp[c] = x;
q.push(x);
}
int wpl = getwpl();
int m;
scanf("%d",&m);
for(int i=1;i<=m;i++){
if(judge(wpl)) printf("Yes\n");
else printf("No\n");
}
return 0;
}
原文链接: https://www.cnblogs.com/FlyingJack/p/13256926.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/344612
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!