#include <stdio.h> #include <string.h> #include<algorithm> #include <queue> #include <vector> using namespace std; #define INF 0x7fffffff #define M 222 #define N 10000 typedef pair<int,int>pii; struct { int lc,rc; int fre;//频数 int code;//code的长度 }t[201]; int sum; void traversal(int root,int deep) { if (t[root].lc==0 && t[root].rc==0) { sum+=deep*t[root].fre; return; } if (t[root].lc) traversal(t[root].lc,deep+1); if (t[root].rc) traversal(t[root].rc,deep+1); } int main () { //freopen("1053.txt","r",stdin); char s[N],*p; int a[M];//包括数字和大写字母 int min1,min2,len,slen,i,j; while(scanf("%s",s),strcmp(s,"END")) { priority_queue<pii,vector<pii>,greater<pii> > q; p=s; for (i=0;i<M;i++) a[i]=0; while(*p) { a[*p]++; p++; } for (j=1,i=0;i<M;i++) { if (a[i]) { t[j].lc=t[j].rc=0; t[j].fre=a[i]; q.push(make_pair(t[j].fre,j)); j++; } } slen=strlen(s); len=j-1; if (len==1)//注意特殊情况 { printf("%d %d %.1lf/n",slen*8,slen,8.); continue; } for (i=len;i<2*len;i++) { t[i].lc=t[i].rc=0; } for (i=len+1;i<2*len;i++) { pii y=q.top(); min1=y.second; q.pop(); y=q.top(); min2=y.second; q.pop(); t[i].lc=min1; t[i].rc=min2; t[i].fre=t[min1].fre+t[min2].fre; q.push(make_pair(t[i].fre,i)); } sum=0; traversal(2*len-1,0); printf("%d %d %.1lf/n",slen*8,sum,8.*slen/sum); } }