#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct {
int data;
int papa;
}arr[1000];
int cmp(const void *a,const void *b)
{
return *(char *)a-*(char *)b;
}
int main()
{
int sum,s,i,k,len,p,min[2],vis[2],chang,j,pp;
char c,str[100];
while(gets(str)){
if(!strcmp(str,"END"))break;
k=0;
pp=len=strlen(str);
qsort(str,len,sizeof(char),cmp);
c=str[0];
p=1;
for(i=1;i<len;i++)
{
if(str[i]==c) p++;
else
{
arr[k].data=p;
arr[k++].papa=-1;
c=str[i];
p=1;
}
if(i==len-1 )
{
arr[k].data=p;
arr[k++].papa=-1;
}
}
if(k==1)
{
printf("%d %d 8.0\n",pp*8,pp);
continue;
}
len=chang=k;
while(len--!=1){
min[0]=min[1]=99999;
for(i=0;i<k;i++)
if(min[0]>arr[i].data && arr[i].papa==-1)
{
min[0]=arr[i].data;
vis[0]=i;
}
for(i=0;i<k;i++)
if(min[1]>arr[i].data && i !=vis[0] && arr[i].papa==-1)
{
min[1]=arr[i].data;
vis[1]=i;
}
arr[k].data=min[0]+min[1];
arr[vis[0]].papa=arr[vis[1]].papa=k;
arr[k++].papa=-1;
}
sum=0;
for(i=0;i<chang;i++)
{
s=0;
j=i;
while(arr[j].papa!=-1)
{
s++;
j=arr[j].papa;
}
sum+=s*arr[i].data;
}
printf("%d %d %.1f\n",pp*8,sum,(float)pp*8.0/(float)sum);
}
return 0;
}
HDU1053--哈夫曼树
最新推荐文章于 2024-07-26 14:45:00 发布