#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char s[500];
int q[1000], t[1000];
void arrange(int a[], int l, int r)//快排函数
{
int x = a[l], i = l, j = r;
if(i >= j)
return;
while(i < j)
{
while(i < j && a[j] >= x)
j--;
a[i] = a[j];
while(i < j && a[i] <= x)
i++;
a[j] = a[i];
}
a[i] = x;
arrange(a,l,i - 1);
arrange(a,i+1,r);
}
int main()
{
int len, i;
while(~scanf("%s",s))
{
memset(t,0,sizeof(t));//数组t[]初始为0;
int top = 0, rear = 0;
len=strlen(s);
int m = len*8;//ASCLL码值每位占8个字节;
for(i = 0;i < len; i++)
t[s[i]]++; //记录下每个字符出现的次数;
for(i =0 ; i < 500; i++)
{
if(t[i])
{
q[top++] = t[i];//把刚才记录的数放进q里并算出共有top-1个数;
}
}
arrange(q,0,top-1);把这些数从小到大排序
int sum = 0;
int x1, x2;
while(top != rear)
{
x1 = q[rear++];//最后一个的时候top是指在最后一个数的后面,此时rear指在最后一个数,
//这样rear++就立刻不满足下面的条件,里面的sum也不会增加了
if(top!=rear)
{
x2 = q[rear++];//为了让rear指向第三个数,进行排序
sum +=x1+x2;
q[top++] = x1+x2;//存放的是x1+x2,而不是sum
arrange(q,rear,top-1);
}
}
printf("%d %d %.1lf\n",m,sum,1.0*m/sum);
}
return 0;
}