#include <iostream>
#include <vector>
using namespace std;
int main()
{
int t, ile=0, k=0, dl;
string zdanie, koniec;
cin >> t;
//SKLEJENIE ZDAN:
for (int i=0; i<=t; i++)
{
getline(cin, zdanie);
koniec += zdanie;
}
int tak=0;
char x;
dl = koniec.length();
vector <char> tab;
for (int i=0; i<dl; i++)
{
//sprawdzenie, czy literka nie wystepuje juz w tablicy
x=koniec[i];
for (int k=0; k<tab.size(); k++)
{
if (x==' ') tak=1;
if (x==tab[k]) tak=1;
}
//jesli nie wstepuje, znajdz dla niej miejsce
if (tak==0 && ((x>64 && x<91) || (x>96 && x<123)))
{
if (tab.size()==0) tab.push_back(x);
else if (tab.size()==1)
{
if (tab[0]<x) tab.push_back(x);
else tab.insert(tab.begin(), x);
}
else if (tab[0]>x) tab.insert(tab.begin(), x);
else if (tab[tab.size()]<x) tab.push_back(x);
else
for (int j=0; j<tab.size(); j++)
{
if ((x>tab[j])&& (x<tab[j+1])) tab.insert(tab.begin()+j, x); // <-- tu jest blad
}
}
tak=0;
}
//policz ile jest wystapien literki w tablicy i wyswietl
for (int i=0; i<tab.size(); i++)
{
int ile=0;
for (int j=0; j<dl; j++)
{
if (koniec[j]==tab[i]) ile++;
}
cout << tab[i] << " " << ile<< endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCgppbnQgbWFpbigpCnsKICAgIGludCB0LCBpbGU9MCwgaz0wLCBkbDsKICAgIHN0cmluZyB6ZGFuaWUsIGtvbmllYzsKICAgIGNpbiA+PiB0OwoKICAgIC8vU0tMRUpFTklFIFpEQU46CiAgICBmb3IgKGludCBpPTA7IGk8PXQ7IGkrKykKICAgIHsKICAgICAgICBnZXRsaW5lKGNpbiwgemRhbmllKTsKICAgICAgICBrb25pZWMgKz0gemRhbmllOwogICAgfQoKICAgIGludCB0YWs9MDsKICAgIGNoYXIgeDsKICAgIGRsID0ga29uaWVjLmxlbmd0aCgpOwogICAgdmVjdG9yIDxjaGFyPiB0YWI7CgogICAgZm9yIChpbnQgaT0wOyBpPGRsOyBpKyspCiAgICB7CiAgICAgICAgLy9zcHJhd2R6ZW5pZSwgY3p5IGxpdGVya2EgbmllIHd5c3RlcHVqZSBqdXogdyB0YWJsaWN5CiAgICAgICAgeD1rb25pZWNbaV07CiAgICAgICAgZm9yIChpbnQgaz0wOyBrPHRhYi5zaXplKCk7IGsrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmICh4PT0nICcpIHRhaz0xOwogICAgICAgICAgICBpZiAoeD09dGFiW2tdKSB0YWs9MTsKICAgICAgICB9CgogICAgICAgIC8vamVzbGkgbmllIHdzdGVwdWplLCB6bmFqZHogZGxhIG5pZWogbWllanNjZQogICAgICAgIGlmICh0YWs9PTAgJiYgKCh4PjY0ICYmIHg8OTEpIHx8ICh4Pjk2ICYmIHg8MTIzKSkpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGFiLnNpemUoKT09MCkgdGFiLnB1c2hfYmFjayh4KTsKICAgICAgICAgICAgZWxzZSBpZiAodGFiLnNpemUoKT09MSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRhYlswXTx4KSB0YWIucHVzaF9iYWNrKHgpOwogICAgICAgICAgICAgICAgZWxzZSB0YWIuaW5zZXJ0KHRhYi5iZWdpbigpLCB4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0YWJbMF0+eCkgdGFiLmluc2VydCh0YWIuYmVnaW4oKSwgeCk7CiAgICAgICAgICAgIGVsc2UgaWYgKHRhYlt0YWIuc2l6ZSgpXTx4KSB0YWIucHVzaF9iYWNrKHgpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBmb3IgKGludCBqPTA7IGo8dGFiLnNpemUoKTsgaisrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICgoeD50YWJbal0pJiYgKHg8dGFiW2orMV0pKSB0YWIuaW5zZXJ0KHRhYi5iZWdpbigpK2osIHgpOyAvLyA8LS0gdHUgamVzdCBibGFkCiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB0YWs9MDsKICAgIH0KCiAgICAvL3BvbGljeiBpbGUgamVzdCB3eXN0YXBpZW4gbGl0ZXJraSB3IHRhYmxpY3kgaSB3eXN3aWV0bAogICAgZm9yIChpbnQgaT0wOyBpPHRhYi5zaXplKCk7IGkrKykKICAgIHsKICAgICAgICBpbnQgaWxlPTA7CiAgICAgICAgZm9yIChpbnQgaj0wOyBqPGRsOyBqKyspCiAgICAgICAgewogICAgICAgICAgICBpZiAoa29uaWVjW2pdPT10YWJbaV0pIGlsZSsrOwogICAgICAgIH0KICAgICAgICBjb3V0IDw8IHRhYltpXSA8PCAiICIgPDwgaWxlPDwgZW5kbDsKICAgIH0KICAgIHJldHVybiAwOwp9Cg==