#include <iostream>
#include <string>
// Định nghĩa cấu trúc Node cho linked list
struct Node {
std::string code;
int count;
Node* next;
Node(const std::string& c) : code(c), count(1), next(nullptr) {}
};
// Hàm chèn một node mới vào linked list đã sắp xếp theo mã hàng
void insertSorted(Node*& head, const std::string& code) {
Node* newNode = new Node(code);
if (!head || code < head->code) {
newNode->next = head;
head = newNode;
} else {
Node* current = head;
while (current->next && current->next->code < code) {
current = current->next;
}
if (current->next && current->next->code == code) {
current->next->count++;
delete newNode;
} else {
newNode->next = current->next;
current->next = newNode;
}
}
}
// Hàm chuyển linked list sang mảng
void linkedListToArray(Node* head, std::pair<std::string, int> arr[], int& size) {
size = 0;
Node* current = head;
while (current) {
arr[size++] = {current->code, current->count};
current = current->next;
}
}
bool slt(std::string x, std::string y) {
if (x.size() < y.size()) return true;
else if (x.size() > y.size()) return false;
return (x < y);
}
int partition(std::pair<std::string, int> a[], int left, int right) {
std::pair<std::string, int> pivot = a[right];
int id = left - 1;
for (int i = left; i < right; i++) {
if ((a[i].second > pivot.second) || (a[i].second == pivot.second && slt(a[i].first, pivot.first))) {
id++;
std::swap(a[id], a[i]);
}
}
id++;
std::swap(a[id], a[right]);
return id;
}
void Sort_pairSecond(std::pair<std::string, int> a[], int left, int right) {
if (left < right) {
int id_pivot = partition(a, left, right);
Sort_pairSecond(a, left, id_pivot - 1);
Sort_pairSecond(a, id_pivot + 1, right);
}
}
int main() {
int n;
std::cin >> n;
std::cin.ignore();
Node* head = nullptr;
for (int i = 0; i < n; ++i) {
std::string code;
std::cin >> code;
insertSorted(head, code);
}
std::pair<std::string, int> arr[n]; // Kích thước tối đa
int size = 0;
linkedListToArray(head, arr, size);
Sort_pairSecond(arr, 0, size - 1);
for (int i = 0; i < size; ++i) {
std::cout << arr[i].first << ' ' << arr[i].second << '\n';
}
// Giải phóng bộ nhớ của linked list
Node* current = head;
while (current) {
Node* next = current->next;
delete current;
current = next;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKLy8gxJDhu4tuaCBuZ2jEqWEgY+G6pXUgdHLDumMgTm9kZSBjaG8gbGlua2VkIGxpc3QKc3RydWN0IE5vZGUgewogICAgc3RkOjpzdHJpbmcgY29kZTsKICAgIGludCBjb3VudDsKICAgIE5vZGUqIG5leHQ7CgogICAgTm9kZShjb25zdCBzdGQ6OnN0cmluZyYgYykgOiBjb2RlKGMpLCBjb3VudCgxKSwgbmV4dChudWxscHRyKSB7fQp9OwoKLy8gSMOgbSBjaMOobiBt4buZdCBub2RlIG3hu5tpIHbDoG8gbGlua2VkIGxpc3QgxJHDoyBz4bqvcCB44bq/cCB0aGVvIG3DoyBow6BuZwp2b2lkIGluc2VydFNvcnRlZChOb2RlKiYgaGVhZCwgY29uc3Qgc3RkOjpzdHJpbmcmIGNvZGUpIHsKICAgIE5vZGUqIG5ld05vZGUgPSBuZXcgTm9kZShjb2RlKTsKICAgIGlmICghaGVhZCB8fCBjb2RlIDwgaGVhZC0+Y29kZSkgewogICAgICAgIG5ld05vZGUtPm5leHQgPSBoZWFkOwogICAgICAgIGhlYWQgPSBuZXdOb2RlOwogICAgfSBlbHNlIHsKICAgICAgICBOb2RlKiBjdXJyZW50ID0gaGVhZDsKICAgICAgICB3aGlsZSAoY3VycmVudC0+bmV4dCAmJiBjdXJyZW50LT5uZXh0LT5jb2RlIDwgY29kZSkgewogICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dDsKICAgICAgICB9CiAgICAgICAgaWYgKGN1cnJlbnQtPm5leHQgJiYgY3VycmVudC0+bmV4dC0+Y29kZSA9PSBjb2RlKSB7CiAgICAgICAgICAgIGN1cnJlbnQtPm5leHQtPmNvdW50Kys7CiAgICAgICAgICAgIGRlbGV0ZSBuZXdOb2RlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5ld05vZGUtPm5leHQgPSBjdXJyZW50LT5uZXh0OwogICAgICAgICAgICBjdXJyZW50LT5uZXh0ID0gbmV3Tm9kZTsKICAgICAgICB9CiAgICB9Cn0KCi8vIEjDoG0gY2h1eeG7g24gbGlua2VkIGxpc3Qgc2FuZyBt4bqjbmcKdm9pZCBsaW5rZWRMaXN0VG9BcnJheShOb2RlKiBoZWFkLCBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludD4gYXJyW10sIGludCYgc2l6ZSkgewogICAgc2l6ZSA9IDA7CiAgICBOb2RlKiBjdXJyZW50ID0gaGVhZDsKICAgIHdoaWxlIChjdXJyZW50KSB7CiAgICAgICAgYXJyW3NpemUrK10gPSB7Y3VycmVudC0+Y29kZSwgY3VycmVudC0+Y291bnR9OwogICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwogICAgfQp9Cgpib29sIHNsdChzdGQ6OnN0cmluZyB4LCBzdGQ6OnN0cmluZyB5KSB7CiAgICBpZiAoeC5zaXplKCkgPCB5LnNpemUoKSkgcmV0dXJuIHRydWU7CiAgICBlbHNlIGlmICh4LnNpemUoKSA+IHkuc2l6ZSgpKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gKHggPCB5KTsKfQoKaW50IHBhcnRpdGlvbihzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludD4gYVtdLCBpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CiAgICBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludD4gcGl2b3QgPSBhW3JpZ2h0XTsKICAgIGludCBpZCA9IGxlZnQgLSAxOwogICAgZm9yIChpbnQgaSA9IGxlZnQ7IGkgPCByaWdodDsgaSsrKSB7CiAgICAgICAgaWYgKChhW2ldLnNlY29uZCA+IHBpdm90LnNlY29uZCkgfHwgKGFbaV0uc2Vjb25kID09IHBpdm90LnNlY29uZCAmJiBzbHQoYVtpXS5maXJzdCwgcGl2b3QuZmlyc3QpKSkgewogICAgICAgICAgICBpZCsrOwogICAgICAgICAgICBzdGQ6OnN3YXAoYVtpZF0sIGFbaV0pOwogICAgICAgIH0KICAgIH0KICAgIGlkKys7CiAgICBzdGQ6OnN3YXAoYVtpZF0sIGFbcmlnaHRdKTsKICAgIHJldHVybiBpZDsKfQoKdm9pZCBTb3J0X3BhaXJTZWNvbmQoc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBpbnQ+IGFbXSwgaW50IGxlZnQsIGludCByaWdodCkgewogICAgaWYgKGxlZnQgPCByaWdodCkgewogICAgICAgIGludCBpZF9waXZvdCA9IHBhcnRpdGlvbihhLCBsZWZ0LCByaWdodCk7CiAgICAgICAgU29ydF9wYWlyU2Vjb25kKGEsIGxlZnQsIGlkX3Bpdm90IC0gMSk7CiAgICAgICAgU29ydF9wYWlyU2Vjb25kKGEsIGlkX3Bpdm90ICsgMSwgcmlnaHQpOwogICAgfQp9CgppbnQgbWFpbigpIHsKICAgIGludCBuOwogICAgc3RkOjpjaW4gPj4gbjsKICAgIHN0ZDo6Y2luLmlnbm9yZSgpOwoKICAgIE5vZGUqIGhlYWQgPSBudWxscHRyOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBzdGQ6OnN0cmluZyBjb2RlOwogICAgICAgIHN0ZDo6Y2luID4+IGNvZGU7CiAgICAgICAgaW5zZXJ0U29ydGVkKGhlYWQsIGNvZGUpOwogICAgfQoKICAgIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgaW50PiBhcnJbbl07IC8vIEvDrWNoIHRoxrDhu5tjIHThu5FpIMSRYQogICAgaW50IHNpemUgPSAwOwogICAgbGlua2VkTGlzdFRvQXJyYXkoaGVhZCwgYXJyLCBzaXplKTsKCiAgICBTb3J0X3BhaXJTZWNvbmQoYXJyLCAwLCBzaXplIC0gMSk7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgYXJyW2ldLmZpcnN0IDw8ICcgJyA8PCBhcnJbaV0uc2Vjb25kIDw8ICdcbic7CiAgICB9CgogICAgLy8gR2nhuqNpIHBow7NuZyBi4buZIG5o4bubIGPhu6dhIGxpbmtlZCBsaXN0CiAgICBOb2RlKiBjdXJyZW50ID0gaGVhZDsKICAgIHdoaWxlIChjdXJyZW50KSB7CiAgICAgICAgTm9kZSogbmV4dCA9IGN1cnJlbnQtPm5leHQ7CiAgICAgICAgZGVsZXRlIGN1cnJlbnQ7CiAgICAgICAgY3VycmVudCA9IG5leHQ7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0=