// Safaa_Eek 305073363 Enas_Bisharat 200686129 
package main
 
import (
	"fmt"
	)
	
//we define an array of elems, each elem is a struct and has two fields:
//one for the letter and the second is for the instances.
type elem struct {
        index byte
        n int
}

//this function recieve "byte"(a letter)and return the lower case of the letter 
func ToLower( c byte) byte{
		if c >= 'A' && c<='Z'{
			return c-'A'+'a'
		}
		return c
}

//this function recieve "byte"(a letter)and return the upper case of the letter 
func ToUpper( c byte) byte{
		if c >= 'a' && c<='z'{
			return c-'a'+'A'
		}
		return c

} 
 


func main() {
        var c byte
        var count [26]elem        
		var temp elem
		
		//define the array of elems, the index field has the letter,(sorted 
		//from a to z) and the instances field is 0 at the beggining and then 
		//it will be the number of the instances of each letter
		for i := 0; i<26; i++ {
		count[i].index = byte('a'+i)
		count[i].n = 0
		}	

        //recieve letters until "enter" is recieved for the first time
    	for {
		fmt.Scanf("%c",&c)
		if c == '\n' { break }
		c = ToLower(c)
		//get the lower case of the letter and we see if it is legal
		//(between a and z)
		if c>='a' && c<='z' {
		//update our array in the right place.. we add 1 the instances field 
				count[c-'a'].n +=1	
				
			}
		}        
	    
	//and now we sort our array, by finding the maximum in each iteration 
    //and put it in the right place (replace elems) 
	for i:=0; i<26 ; i++ {
		for j:=i+1; j<26 ; j++{
			if count[i].n < count[j].n {
				temp = count[i]
				count[i]=count[j]
				count[j]=temp
			}
		}
	}	
	//print the unempty places in our array(the letters that have been recieved)
 	for i:=0 ; i<26 ; i++ {	
		if count[i].n != 0{	
		fmt.Println(string(count[i].index), "/",string(ToUpper(count[i].index)),
			"    ", count[i].n)
		}
	}
}
