#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct BSTNode {
string key;
int value;
int left;
int right;
BSTNode() : key(""), value(0), left(-1), right(-1) {}
};
int insertNodeBST(vector<BSTNode>& tree, int rootIndex, const string& key, int& nextAvailableIndex) {
if (rootIndex == -1) {
if (nextAvailableIndex >= tree.size()) {
tree.resize(nextAvailableIndex + 1);
}
tree[nextAvailableIndex].key = key;
tree[nextAvailableIndex].value = 1;
return nextAvailableIndex++;
}
if (key < tree[rootIndex].key) {
tree[rootIndex].left = insertNodeBST(tree, tree[rootIndex].left, key, nextAvailableIndex);
} else if (key > tree[rootIndex].key) {
tree[rootIndex].right = insertNodeBST(tree, tree[rootIndex].right, key, nextAvailableIndex);
} else {
tree[rootIndex].value++;
}
return rootIndex;
}
void inOrderTraversalBST(const vector<BSTNode>& tree, int index, vector<pair<string, int>>& result) {
if (index != -1) {
inOrderTraversalBST(tree, tree[index].left, result);
result.push_back({tree[index].key, tree[index].value});
inOrderTraversalBST(tree, tree[index].right, result);
}
}
bool slt(string x, string y)
{
if (x.size() == y.size())
return (x < y);
return (x.size() < y.size());
}
bool comparePairs(const pair<string, int>& a, const pair<string, int>& b) {
if (a.second != b.second) {
return (a.second > b.second);
}
return slt(a.first, b.first);
}
int partition(vector<pair<string, int>>& a, int left, int right) {
pair<string, int> pivot = a[right];
int id = left - 1;
for (int i = left; i < right; i++) {
if (comparePairs(a[i], pivot)) {
id++;
swap(a[id], a[i]);
}
}
id++;
swap(a[id], a[right]);
return id;
}
void quickSort(vector<pair<string, int>>& a, int left, int right) {
if (left < right) {
int pivot_index = partition(a, left, right);
quickSort(a, left, pivot_index - 1);
quickSort(a, pivot_index + 1, right);
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n;
cin >> n;
cin.ignore();
vector<BSTNode> tree(n); // Kích thước tối đa
int rootIndex = -1;
int nextAvailableIndex = 0;
for (int i = 0; i < n; ++i) {
string x;
cin >> x;
rootIndex = insertNodeBST(tree, rootIndex, x, nextAvailableIndex);
}
vector<pair<string, int>> SortedResult;
inOrderTraversalBST(tree, rootIndex, SortedResult);
quickSort(SortedResult, 0, SortedResult.size() - 1);
for (const auto& p : SortedResult) {
cout << p.first << ' ' << p.second << '\n';
}
//cout << slt("3", "123");
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBCU1ROb2RlIHsKICAgIHN0cmluZyBrZXk7CiAgICBpbnQgdmFsdWU7CiAgICBpbnQgbGVmdDsKICAgIGludCByaWdodDsKCiAgICBCU1ROb2RlKCkgOiBrZXkoIiIpLCB2YWx1ZSgwKSwgbGVmdCgtMSksIHJpZ2h0KC0xKSB7fQp9OwoKaW50IGluc2VydE5vZGVCU1QodmVjdG9yPEJTVE5vZGU+JiB0cmVlLCBpbnQgcm9vdEluZGV4LCBjb25zdCBzdHJpbmcmIGtleSwgaW50JiBuZXh0QXZhaWxhYmxlSW5kZXgpIHsKICAgIGlmIChyb290SW5kZXggPT0gLTEpIHsKICAgICAgICBpZiAobmV4dEF2YWlsYWJsZUluZGV4ID49IHRyZWUuc2l6ZSgpKSB7CiAgICAgICAgICAgIHRyZWUucmVzaXplKG5leHRBdmFpbGFibGVJbmRleCArIDEpOwogICAgICAgIH0KICAgICAgICB0cmVlW25leHRBdmFpbGFibGVJbmRleF0ua2V5ID0ga2V5OwogICAgICAgIHRyZWVbbmV4dEF2YWlsYWJsZUluZGV4XS52YWx1ZSA9IDE7CiAgICAgICAgcmV0dXJuIG5leHRBdmFpbGFibGVJbmRleCsrOwogICAgfQoKICAgIGlmIChrZXkgPCB0cmVlW3Jvb3RJbmRleF0ua2V5KSB7CiAgICAgICAgdHJlZVtyb290SW5kZXhdLmxlZnQgPSBpbnNlcnROb2RlQlNUKHRyZWUsIHRyZWVbcm9vdEluZGV4XS5sZWZ0LCBrZXksIG5leHRBdmFpbGFibGVJbmRleCk7CiAgICB9IGVsc2UgaWYgKGtleSA+IHRyZWVbcm9vdEluZGV4XS5rZXkpIHsKICAgICAgICB0cmVlW3Jvb3RJbmRleF0ucmlnaHQgPSBpbnNlcnROb2RlQlNUKHRyZWUsIHRyZWVbcm9vdEluZGV4XS5yaWdodCwga2V5LCBuZXh0QXZhaWxhYmxlSW5kZXgpOwogICAgfSBlbHNlIHsKICAgICAgICB0cmVlW3Jvb3RJbmRleF0udmFsdWUrKzsKICAgIH0KICAgIHJldHVybiByb290SW5kZXg7Cn0KCnZvaWQgaW5PcmRlclRyYXZlcnNhbEJTVChjb25zdCB2ZWN0b3I8QlNUTm9kZT4mIHRyZWUsIGludCBpbmRleCwgdmVjdG9yPHBhaXI8c3RyaW5nLCBpbnQ+PiYgcmVzdWx0KSB7CiAgICBpZiAoaW5kZXggIT0gLTEpIHsKICAgICAgICBpbk9yZGVyVHJhdmVyc2FsQlNUKHRyZWUsIHRyZWVbaW5kZXhdLmxlZnQsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnB1c2hfYmFjayh7dHJlZVtpbmRleF0ua2V5LCB0cmVlW2luZGV4XS52YWx1ZX0pOwogICAgICAgIGluT3JkZXJUcmF2ZXJzYWxCU1QodHJlZSwgdHJlZVtpbmRleF0ucmlnaHQsIHJlc3VsdCk7CiAgICB9Cn0KCmJvb2wgc2x0KHN0cmluZyB4LCBzdHJpbmcgeSkKewoJaWYgKHguc2l6ZSgpID09IHkuc2l6ZSgpKQoJCXJldHVybiAoeCA8IHkpOwoJcmV0dXJuICh4LnNpemUoKSA8IHkuc2l6ZSgpKTsKfQoKYm9vbCBjb21wYXJlUGFpcnMoY29uc3QgcGFpcjxzdHJpbmcsIGludD4mIGEsIGNvbnN0IHBhaXI8c3RyaW5nLCBpbnQ+JiBiKSB7CiAgICBpZiAoYS5zZWNvbmQgIT0gYi5zZWNvbmQpIHsKICAgICAgICByZXR1cm4gKGEuc2Vjb25kID4gYi5zZWNvbmQpOwogICAgfQogICAgcmV0dXJuIHNsdChhLmZpcnN0LCBiLmZpcnN0KTsKfQoKaW50IHBhcnRpdGlvbih2ZWN0b3I8cGFpcjxzdHJpbmcsIGludD4+JiBhLCBpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CiAgICBwYWlyPHN0cmluZywgaW50PiBwaXZvdCA9IGFbcmlnaHRdOwogICAgaW50IGlkID0gbGVmdCAtIDE7CiAgICBmb3IgKGludCBpID0gbGVmdDsgaSA8IHJpZ2h0OyBpKyspIHsKICAgICAgICBpZiAoY29tcGFyZVBhaXJzKGFbaV0sIHBpdm90KSkgewogICAgICAgICAgICBpZCsrOwogICAgICAgICAgICBzd2FwKGFbaWRdLCBhW2ldKTsKICAgICAgICB9CiAgICB9CiAgICBpZCsrOwogICAgc3dhcChhW2lkXSwgYVtyaWdodF0pOwogICAgcmV0dXJuIGlkOwp9Cgp2b2lkIHF1aWNrU29ydCh2ZWN0b3I8cGFpcjxzdHJpbmcsIGludD4+JiBhLCBpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CiAgICBpZiAobGVmdCA8IHJpZ2h0KSB7CiAgICAgICAgaW50IHBpdm90X2luZGV4ID0gcGFydGl0aW9uKGEsIGxlZnQsIHJpZ2h0KTsKICAgICAgICBxdWlja1NvcnQoYSwgbGVmdCwgcGl2b3RfaW5kZXggLSAxKTsKICAgICAgICBxdWlja1NvcnQoYSwgcGl2b3RfaW5kZXggKyAxLCByaWdodCk7CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwogICAgY291dC50aWUobnVsbHB0cik7CgogICAgaW50IG47CiAgICBjaW4gPj4gbjsKICAgIGNpbi5pZ25vcmUoKTsKCiAgICB2ZWN0b3I8QlNUTm9kZT4gdHJlZShuKTsgLy8gS8OtY2ggdGjGsOG7m2MgdOG7kWkgxJFhCiAgICBpbnQgcm9vdEluZGV4ID0gLTE7CiAgICBpbnQgbmV4dEF2YWlsYWJsZUluZGV4ID0gMDsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIHN0cmluZyB4OwogICAgICAgIGNpbiA+PiB4OwogICAgICAgIHJvb3RJbmRleCA9IGluc2VydE5vZGVCU1QodHJlZSwgcm9vdEluZGV4LCB4LCBuZXh0QXZhaWxhYmxlSW5kZXgpOwogICAgfQoKICAgIHZlY3RvcjxwYWlyPHN0cmluZywgaW50Pj4gU29ydGVkUmVzdWx0OwogICAgaW5PcmRlclRyYXZlcnNhbEJTVCh0cmVlLCByb290SW5kZXgsIFNvcnRlZFJlc3VsdCk7CgogICAgcXVpY2tTb3J0KFNvcnRlZFJlc3VsdCwgMCwgU29ydGVkUmVzdWx0LnNpemUoKSAtIDEpOwoKICAgIGZvciAoY29uc3QgYXV0byYgcCA6IFNvcnRlZFJlc3VsdCkgewogICAgICAgIGNvdXQgPDwgcC5maXJzdCA8PCAnICcgPDwgcC5zZWNvbmQgPDwgJ1xuJzsKICAgIH0KCQoJLy9jb3V0IDw8IHNsdCgiMyIsICIxMjMiKTsKICAgIHJldHVybiAwOwp9