题意:huffman编码,求WPL。
想法:不需要模拟每一个ascii的huffman code,只要计算WPL即可,很简单。
使用优先队列。
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<queue>
#include<stdlib.h>
using namespace std;
int ascii[260];
int cnt;
priority_queue<int, vector<int>, greater<int> >q;
int main()
{
string s;
while(cin>>s)
{
if(s=="END") break;
int len=s.length();
while(!q.empty()) q.pop();
memset(ascii,0,sizeof(ascii));
for(int i=0;i<len;i++)
{
ascii[s[i]]++;
}
int cnt=0;
for(int i=0;i<260;i++)
{
if(ascii[i])
{
cnt++;
q.push(ascii[i]);
}
}
if(cnt==1)
{
cout<<len*8<<" "<<len<<" "<<"8.0"<<endl;
continue;
}
int ans=0;
while(q.size()>=2)
{
int next;
next=q.top();
q.pop();
next+=q.top();
q.pop();
q.push(next);
ans+=next;
}
printf("%d %d %.1lf\n",len*8,ans,len*8.0/ans);
}
return 0;
}