Huffman编码
描述
给你n个字符串,对于输入中的每个文本字符串,输出8位ASCII编码的位长度,哈夫曼编码的位长度,以及精确到一个小数点的压缩率。
输入
多组输入,读入以EOF结束。
每行一个 文本字符串仅包含大写字母数字字符和下划线。字符串长度不大于100
输出
对于输入中的每个文本字符串,输出8位ASCII编码的位长度,哈夫曼编码的位长度,以及精确到一个小数点的压缩率。
输入
AAAAABCD
THE_CAT_IN_THE_HAT
输出
64 13 4.9
144 51 2.8
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
int rec[28];
priority_queue<int,vector<int>,greater<int> > Q;
int huffman()
{
int ans = 0;
while(Q.size()>=2){
int a = Q.top();
Q.pop();
int b = Q.top();
Q.pop();
ans = ans+a+b;
Q.push(a+b);
}
return ans;
}
int main(void)
{
char str[101];
while(scanf("%s",&str)!=EOF){
int len = strlen(str);
memset(rec,0,sizeof(rec));
for(int i=0;i<len;i++){
if(str[i]>='A'&&str[i]<='Z') rec[str[i]-'A']++;
if(str[i]=='_') rec[26]++;
}
while(Q.size()>0) Q.pop();
for(int i=0;i<27;i++){
if(rec[i]>0){
Q.push(rec[i]);
}
}
int huf = huffman();
double ratio = double(8*len)/double(huf);
printf("%d %d %.1f\n",8*len,huf,ratio);
}
return 0;
}