来源:https://vjudge.net/problem/POJ-1521
输入:输入文件将包含一个文本字符串列表,每行一个。文本字符串将仅包含大写字母数字字符和下划线(用于代替空格)。输入的结尾将由仅包含单词“END”作为文本字符串的行发出信号。 输出 对于输入中的每个文本字符串,输出8位ASCII编码的位长度,最佳无前缀可变长度编码的位长度,以及精确到一个小数点的压缩率。
样例输入:
AAAAABCD
THE_CAT_IN_THE_HAT
END
样例输出:
64 13 4.9
144 51 2.8
#include <bits/stdc++.h>
using namespace std;
string s;
int len;
int a[100];//统计出现频率
int main(){
while(true){
priority_queue<int,vector<int>,greater<int> >Q;
memset(a,0,sizeof(a));//重新赋0
cin>>s;
if(s=="END"){
break;
}
len=s.size();
int asc=len*8;//ascll编码长度
//统计频率
for(int i=0;i<s.size();i++){
if(s[i]=='_'){
a[26]++;
}
a[s[i]-'A']++;
}
//进入队列
for(int i=0;i<=26;i++){
if(a[i]>0){
Q.push(a[i]);
}
}
int total=0;//huffman编码长度
while(true){
int sum=0;
sum=sum+Q.top();
Q.pop();
sum=sum+Q.top();
Q.pop();
Q.push(sum);
total=total+sum;
if(Q.size()==1){
break;
}
}
printf("%d %d %.1lf\n",asc,total,(double)asc/total);
}
}