#define _CRT_SECURE_NO_WARNINGS
#include <ctype.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char ch;
int count;
} Pair;
int comp(const void *pa, const void *pb) {
Pair a = *(Pair *)pa;
Pair b = *(Pair *)pb;
if (a.count > b.count) return -1;
if (a.count < b.count) return 1;
return 0;
}
void pretty_print_char(char c) {
switch (c) {
case '\0' : printf(" \\0"); break;
case '\n' : printf(" \\n"); break;
case '\r' : printf(" \\r"); break;
case '\t' : printf(" \\t"); break;
case '\f' : printf(" \\f"); break;
case '\013': printf(" \\v"); break;
case '\010': printf(" \\b"); break;
case '\007': printf(" \\a"); break;
case '\033': printf(" \\e"); break;
case ' ' : printf(" ' '") ; break;
case '\\' : printf(" \\\\"); break;
case '\x7f': printf(" \\c?"); break;
default: if (isgraph(c)) {
printf("%4c", c);
} else {
printf("\\x%02x", (int)c);
}
}
}
int main(void) {
Pair array[256];
for (int i = 0; i < 256; ++i) {
array[i].ch = (char)i;
array[i].count = 0;
}
char line[648];
if (fgets(line, sizeof line, stdin)) {
int len = strlen(line);
for (int i = 0; i < len; ++i) {
array[(int)line[i]].count++;
}
qsort(array, 256, sizeof(Pair), comp);
for (int i = 0; array[i].count; ++i) {
pretty_print_char(array[i].ch);
printf(": %3d, %5.2lf%%\n", array[i].count, array[i].count * 100.0 / len);
}
}
return 0;
}