//poj 1521
//sep9
#include <iostream>
#include <queue>
using namespace std;
typedef pair<int,int> pii;
char s[10024];
int height[512];
int cnt[512];
int f[512];
int find(int u)
{
return f[u]==u?f[u]:f[u]=find(f[u]);
}
void solve()
{
int len=strlen(s);
memset(cnt,0,sizeof(cnt));
for(int i=0;i<256;++i)
f[i]=i,height[i]=1;
for(int i=0;i<len;++i)
++cnt[s[i]];
priority_queue<pii,vector<pii>,greater<pii> > q;
int sum=0;
for(int i=0;i<256;++i)
if(cnt[i]){
q.push(make_pair(cnt[i],i));
++sum;
}
if(sum==1){
printf("%d %d %.1lf\n",len*8,len,8.0*len/len);
return ;
}
for(int k=0;k<sum-1;++k){
pii x=q.top();
q.pop();
pii y=q.top();
q.pop();
int u=x.second;
int v=y.second;
int pu=find(u);
int pv=find(v);
f[pu]=pv;
pii z=make_pair(x.first+y.first,pv);
q.push(z);
for(int i=0;i<256;++i)
if(find(i)==pv)
++height[i];
}
int ans=0;
for(int i=0;i<len;++i)
ans+=height[s[i]]-1;
printf("%d %d %.1lf\n",len*8,ans,len*8.0/ans);
}
int main()
{
while(scanf("%s",s)==1&&strcmp(s,"END")!=0){
solve();
}
return 0;
}
poj 1521 Entropy 并查集+优先队列实现哈夫曼编码
最新推荐文章于 2023-02-04 11:15:00 发布