题意
哈夫曼编码
思路
这段代码是我网上抄的……哇作者居然能想到用负值的优先队列实现哈夫曼树,真的是厉害了……反正我是没想到……
代码
#include<iostream>
#include<map>
#include<queue>
#include <string>
#include <string.h>
using namespace std;
const int maxn = 100000 + 10;
char str[maxn];
int main(){
while(cin>>str && strcmp(str,"END"))
{
map<char,int> m;
int len = strlen(str);
int res1 = len * 8;
char *p = str;
while(*p){
m[*p]++;
p++;
}
map<char,int>::iterator itm;
priority_queue< int > qu;
for( itm = m.begin();itm!=m.end();itm++ ){
qu.push(-itm->second );
}
int res2 = 0;
while(!qu.empty()){
int a,b;
if(qu.size() == 1) {
if(!res2)
res2 = qu.top();
break;
}
a = qu.top();qu.pop();
b = qu.top();qu.pop();
res2 += a+b;
qu.push( a+b );
}
printf("%d %d %.1f\n",res1,-res2,(double)res1/-res2);
}
return 0;
}