# Hdu 1053 Entropy查出错（修改）

#pragma warning(disable : 4786)

#include<iostream>

#include<string>

#include<vector>

#include<algorithm>

using namespace std;

struct Node

{

int weight;

int parent,lchild,rchild;

};

int findMinIndex(vector <Node> &ht,int n)

{

int min=INT_MAX, minIndex=0;

for(int i=1;i<n;i++)

{

if (ht[i].parent==0 && ht[i].weight<min)

{

minIndex=i;

min=ht[i].weight;

}

}

ht[minIndex].parent=n;

return minIndex;

}

vector <Node> createHuffman(vector <int> weight)

{

int n=weight.size();

int m=2*n-1;

vector <Node> ht(m+1);

int i;

for(i=1;i<=m;i++)

{

ht[i].weight=ht[i].parent=ht[i].lchild=ht[i].rchild=0;

if (i<=n) ht[i].weight=weight[i-1];

}

for(i=n+1;i<=m;i++)

{

int s1=findMinIndex(ht,i);

int s2=findMinIndex(ht,i);

ht[i].lchild=s1;

ht[i].rchild=s2;

ht[i].weight=ht[s1].weight+ht[s2].weight;

}

return ht;

}

vector <string> codeHuffman(vector <Node> ht, int n)

{

vector <string> hc(n+1,"");

for(int i=1;i<=n;i++)

{

int parent=ht[i].parent, j=i;

while(parent!=0)

{

if (ht[parent].lchild==j)

hc[i]='0'+hc[i];

else

hc[i]='1'+hc[i];

j=parent;

parent=ht[j].parent;

}

}

return hc;

}

bool run()

{

string s;

cin>>s;

if (s=="END") return false;

sort(s.begin(),s.end());

vector <int> weight;

int cnt=1,n=s.size();

for(int i=1;i<n;i++)

{

if (s[i-1]==s[i])

{

cnt++;

}

else

{

weight.push_back(cnt);

cnt=1;

}

}

weight.push_back(cnt);

vector <Node> ht=createHuffman(weight);

vector <string> result=codeHuffman(ht,weight.size());

int m=0;

for(int j=0;j<weight.size();j++)

{

m+=result[j+1].size()*weight[j];

}

if (m==0)

printf("%d %d %.1lf/n",n*8,n,8.0);

else

printf("%d %d %.1lf/n",n*8,m,n*8.0/m);

return true;

}

int main()

{

while(run());

return 0;

}