#include <iostream>
#include <string>
#include <algorithm>
#include <utility>
#include <vector>
using namespace std;
struct sort_names {
bool operator()(const std::pair<string, int> &left, const std::pair<string, int> &right) {
return left.first < right.first;
}
};
struct sort_values {
bool operator()(const std::pair<string, int> &left, const std::pair<string, int> &right) {
return left.second > right.second;
}
};
void show(const vector< pair<string, int> > names) {
for(int i = 0; i < names.size(); ++i)
cout << names[i].first << " " << names[i].second << endl;
}
int main() {
// string ciag, imie;
string ciag, a, b, imie;
bool flag = true;
int end = 0;
vector< pair<string, int> > names; // vector na ktorym operaujemy
// while(getline(cin, ciag)) {
while(cin >> a >> b >> imie) {
// transform(ciag.begin(), ciag.end(), ciag.begin(), ::toupper); // wszystko do duzych liter
transform(imie.begin(), imie.end(), imie.begin(), ::toupper); // imie do duzej litery
// imie = ciag.substr(ciag.find_last_of(" ") + 1, ciag.length()); // wyciagniecie podciagu (imienia)
for(int i = 0; i < names.size(); ++i) { // przeszukaj caly vector w poszukiwaniu podobnego imienia
if(names[i].first == imie) {
names[i].second++;
flag = false; // jesli znaleziono to zwieksz jego ilosc
}
}
if(flag) { // jesli nie znaleziono tych samych imion to dodajemy nowe imie
names.push_back(std::make_pair(imie, 1));
flag = true;
}
// czy to trzeba rozdzielic na dwa sortowania ?
sort(names.begin(), names.end(), sort_names()); // sortowanie vectora po imionach
sort(names.begin(), names.end(), sort_values()); // sortowanie vectora po values
//show(names); // pokazuje vector / czy musi byc w tej petli czy poza petla ?
flag = true; // reset flagi
++end;
if(end >= 7) break;
}
show(names);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPHZlY3Rvcj4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3Qgc29ydF9uYW1lcyB7CiAgICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpwYWlyPHN0cmluZywgaW50PiAmbGVmdCwgY29uc3Qgc3RkOjpwYWlyPHN0cmluZywgaW50PiAmcmlnaHQpIHsKICAgICAgICByZXR1cm4gbGVmdC5maXJzdCA8IHJpZ2h0LmZpcnN0OwogICAgfQp9OwoKc3RydWN0IHNvcnRfdmFsdWVzIHsKICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnBhaXI8c3RyaW5nLCBpbnQ+ICZsZWZ0LCBjb25zdCBzdGQ6OnBhaXI8c3RyaW5nLCBpbnQ+ICZyaWdodCkgewogICAgICAgIHJldHVybiBsZWZ0LnNlY29uZCA+IHJpZ2h0LnNlY29uZDsgICAgCiAgICB9ICAgIAp9OwoKdm9pZCBzaG93KGNvbnN0IHZlY3RvcjwgcGFpcjxzdHJpbmcsIGludD4gPiBuYW1lcykgewogICAgZm9yKGludCBpID0gMDsgaSA8IG5hbWVzLnNpemUoKTsgKytpKQogICAgICAgIGNvdXQgPDwgbmFtZXNbaV0uZmlyc3QgPDwgIiAiIDw8IG5hbWVzW2ldLnNlY29uZCA8PCBlbmRsOyAgICAKfQoKaW50IG1haW4oKSB7Ci8vICBzdHJpbmcgY2lhZywgaW1pZTsKICAgIHN0cmluZyBjaWFnLCBhLCBiLCBpbWllOwogICAgYm9vbCBmbGFnID0gdHJ1ZTsKICAgIGludCBlbmQgPSAwOwogICAgdmVjdG9yPCBwYWlyPHN0cmluZywgaW50PiA+IG5hbWVzOyAvLyB2ZWN0b3IgbmEga3RvcnltIG9wZXJhdWplbXkKCi8vICB3aGlsZShnZXRsaW5lKGNpbiwgY2lhZykpIHsgIAogICAgd2hpbGUoY2luID4+IGEgPj4gYiA+PiBpbWllKSB7Ci8vICAgICAgdHJhbnNmb3JtKGNpYWcuYmVnaW4oKSwgY2lhZy5lbmQoKSwgY2lhZy5iZWdpbigpLCA6OnRvdXBwZXIpOyAvLyB3c3p5c3RrbyBkbyBkdXp5Y2ggbGl0ZXIKICAgICAgICB0cmFuc2Zvcm0oaW1pZS5iZWdpbigpLCBpbWllLmVuZCgpLCBpbWllLmJlZ2luKCksIDo6dG91cHBlcik7IC8vIGltaWUgZG8gZHV6ZWogbGl0ZXJ5Ci8vICAgICAgaW1pZSA9ICBjaWFnLnN1YnN0cihjaWFnLmZpbmRfbGFzdF9vZigiICIpICsgMSwgY2lhZy5sZW5ndGgoKSk7IC8vIHd5Y2lhZ25pZWNpZSBwb2RjaWFndSAoaW1pZW5pYSkKICAgICAgICAKICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbmFtZXMuc2l6ZSgpOyArK2kpIHsgLy8gcHJ6ZXN6dWthaiBjYWx5IHZlY3RvciB3IHBvc3p1a2l3YW5pdSBwb2RvYm5lZ28gaW1pZW5pYQogICAgICAgICAgICBpZihuYW1lc1tpXS5maXJzdCA9PSBpbWllKSB7CiAgICAgICAgICAgICAgICBuYW1lc1tpXS5zZWNvbmQrKzsKICAgICAgICAgICAgICAgIGZsYWcgPSBmYWxzZTsgLy8gamVzbGkgem5hbGV6aW9ubyB0byB6d2lla3N6IGplZ28gaWxvc2MKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihmbGFnKSB7IC8vIGplc2xpIG5pZSB6bmFsZXppb25vIHR5Y2ggc2FteWNoIGltaW9uIHRvIGRvZGFqZW15IG5vd2UgaW1pZQogICAgICAgICAgICBuYW1lcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoaW1pZSwgMSkpOwogICAgICAgICAgICBmbGFnID0gdHJ1ZTsKICAgICAgICAKICAgICAgICB9CgogICAgICAgIC8vIGN6eSB0byB0cnplYmEgcm96ZHppZWxpYyBuYSBkd2Egc29ydG93YW5pYSA/CiAgICAgICAgc29ydChuYW1lcy5iZWdpbigpLCBuYW1lcy5lbmQoKSwgc29ydF9uYW1lcygpKTsgLy8gc29ydG93YW5pZSB2ZWN0b3JhIHBvIGltaW9uYWNoCiAgICAgICAgc29ydChuYW1lcy5iZWdpbigpLCBuYW1lcy5lbmQoKSwgc29ydF92YWx1ZXMoKSk7IC8vIHNvcnRvd2FuaWUgdmVjdG9yYSBwbyB2YWx1ZXMKICAgICAgICAvL3Nob3cobmFtZXMpOyAvLyBwb2thenVqZSB2ZWN0b3IgIC8gY3p5IG11c2kgYnljIHcgdGVqIHBldGxpIGN6eSBwb3phIHBldGxhID8KCiAgICAgICAgZmxhZyA9IHRydWU7IC8vIHJlc2V0IGZsYWdpCgogICAgICAgICsrZW5kOwogICAgICAgIGlmKGVuZCA+PSA3KSBicmVhazsKICAgIH0KICAgIAogICAgc2hvdyhuYW1lcyk7CiAgICAKICAgIHJldHVybiAwOyAgICAKfQ==