POJ1521-huffman编码

来源: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 
using namespace std;
string s;
int len;
int a[100];//统计出现频率 

int main(){	
	while(true){
		priority_queue,greater >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;i0){ 
				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);
	}
}

 

 

你可能感兴趣的:(洛谷刷算法,huffman,wpl)