#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct Words {
string s;
unsigned count;
};
bool compareWords(Words& w1, Words& w2) {
return w1.count > w2.count;
}
int main() {
string s;
vector<Words> WordCount;
vector<string> all_words;
while (cin >> s) {
all_words.push_back(s);
}
sort(all_words.begin(), all_words.end());
int count = 1;
for (int i = 1; i < all_words.size(); ++i) {
if (all_words[i] != all_words[i - 1]) {
//Пришлось чуть помощи у chatgpt попросить, не знал как проверить наличие слова в структуре
auto it = find_if(WordCount.begin(), WordCount.end(), [all_words, i](Words& w) { return w.s == all_words[i - 1]; });
if (it != WordCount.end()) {
it->count += count;
}
else {
WordCount.push_back({all_words[i - 1], count});
}
count = 1;
}
else {
count++;
}
}
//и тут
auto it = find_if(WordCount.begin(), WordCount.end(), [all_words](Words& w) { return w.s == all_words.back(); });
if (it != WordCount.end()) {
it->count += count;
}
else {
WordCount.push_back({all_words.back(), count});
}
sort(WordCount.begin(), WordCount.end(), compareWords);
for (Words w : WordCount) {
cout << w.s << ' ';
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBXb3JkcyB7CiAgICBzdHJpbmcgczsKICAgIHVuc2lnbmVkIGNvdW50Owp9OwoKYm9vbCBjb21wYXJlV29yZHMoV29yZHMmIHcxLCBXb3JkcyYgdzIpIHsKICAgIHJldHVybiB3MS5jb3VudCA+IHcyLmNvdW50Owp9CgppbnQgbWFpbigpIHsKICAgIHN0cmluZyBzOwogICAgdmVjdG9yPFdvcmRzPiBXb3JkQ291bnQ7CiAgICB2ZWN0b3I8c3RyaW5nPiBhbGxfd29yZHM7CgogICAgd2hpbGUgKGNpbiA+PiBzKSB7CiAgICAgICAgYWxsX3dvcmRzLnB1c2hfYmFjayhzKTsKICAgIH0KICAgIHNvcnQoYWxsX3dvcmRzLmJlZ2luKCksIGFsbF93b3Jkcy5lbmQoKSk7CgogICAgaW50IGNvdW50ID0gMTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYWxsX3dvcmRzLnNpemUoKTsgKytpKSB7CiAgICAgICAgaWYgKGFsbF93b3Jkc1tpXSAhPSBhbGxfd29yZHNbaSAtIDFdKSB7IAogICAgICAgIAkvL9Cf0YDQuNGI0LvQvtGB0Ywg0YfRg9GC0Ywg0L/QvtC80L7RidC4INGDIGNoYXRncHQg0L/QvtC/0YDQvtGB0LjRgtGMLCDQvdC1INC30L3QsNC7INC60LDQuiDQv9GA0L7QstC10YDQuNGC0Ywg0L3QsNC70LjRh9C40LUg0YHQu9C+0LLQsCDQsiDRgdGC0YDRg9C60YLRg9GA0LUKICAgICAgICAgICAgYXV0byBpdCA9IGZpbmRfaWYoV29yZENvdW50LmJlZ2luKCksIFdvcmRDb3VudC5lbmQoKSwgW2FsbF93b3JkcywgaV0oV29yZHMmIHcpIHsgcmV0dXJuIHcucyA9PSBhbGxfd29yZHNbaSAtIDFdOyB9KTsKICAgICAgICAgICAgaWYgKGl0ICE9IFdvcmRDb3VudC5lbmQoKSkgewogICAgICAgICAgICAgICAgaXQtPmNvdW50ICs9IGNvdW50OwogICAgICAgICAgICB9IAogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIFdvcmRDb3VudC5wdXNoX2JhY2soe2FsbF93b3Jkc1tpIC0gMV0sIGNvdW50fSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY291bnQgPSAxOwogICAgICAgIH0gCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgfQogICAgfQogICAgLy/QuCDRgtGD0YIKICAgIGF1dG8gaXQgPSBmaW5kX2lmKFdvcmRDb3VudC5iZWdpbigpLCBXb3JkQ291bnQuZW5kKCksIFthbGxfd29yZHNdKFdvcmRzJiB3KSB7IHJldHVybiB3LnMgPT0gYWxsX3dvcmRzLmJhY2soKTsgfSk7CiAgICBpZiAoaXQgIT0gV29yZENvdW50LmVuZCgpKSB7CiAgICAgICAgaXQtPmNvdW50ICs9IGNvdW50OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgV29yZENvdW50LnB1c2hfYmFjayh7YWxsX3dvcmRzLmJhY2soKSwgY291bnR9KTsKICAgIH0KCiAgICBzb3J0KFdvcmRDb3VudC5iZWdpbigpLCBXb3JkQ291bnQuZW5kKCksIGNvbXBhcmVXb3Jkcyk7CiAgICBmb3IgKFdvcmRzIHcgOiBXb3JkQ291bnQpIHsKICAgICAgICBjb3V0IDw8IHcucyA8PCAnICc7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0=