不知道哈夫曼编码的可以先看看https://baike.so.com/doc/6525310-6739042.html
(介绍哈夫曼编码)
然后看看https://blog.csdn.net/u013275340/article/details/38778497(最优前缀码)
******当时自己的错误:
- 忘记讨论Map.size()为1的情况
- Map忘记清零
//HDU1053 yi
#include <iostream>
#include <cstdio>
#include <map>
#include <queue>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
map<char,int> Map;
priority_queue<int,vector<int>,greater<int> > q;
const int maxn=10000;
int main()
{
char a[maxn];
while(EOF!=scanf("%s",a) && 0!=strcmp("END",a))
{
int size1=strlen(a)*8,size2=0;
int i,j;
for(i=0;i<strlen(a);i++){
Map[a[i]]++;
}
if(1==Map.size()){
size2=strlen(a);
printf("%d %d %.1lf\n",size1,size2,(double)size1/(double)(size2));
Map.clear();
continue;
}
while(!q.empty()) q.pop();
map<char,int>::iterator it;
for(it=Map.begin();it!=Map.end();it++){
q.push(it->second);
}
while(q.size()>1){
int c1=q.top();q.pop();
int c2=q.top();q.pop();
size2+=c1+c2;
q.push(c1+c2);
}
q.pop();
printf("%d %d %.1lf\n",size1,size2,(double)size1/(double)(size2));
Map.clear();
}
return 0;
}