G. 奶龙的数字

Medium

时间限制:2000 ms

内存限制:512 MiB

题面

同学们好久不见,自从上学期的程序设计课之后,奶龙现在又有了新的难题,它现在有很多不同进制的非负整数,奶龙想给他们排序却不知道怎么确定数字的大小关系,因此它来向聪明的你求助,也就是说:

给定 n 个非负整数,每个整数都用某种进制表示。

每个数由两部分组成:b s

其中:

  • b 表示进制;
  • s 表示该进制下的数字字符串。

进制 b 的范围是 216

数字字符串 s 中可能出现:

0 1 2 3 4 5 6 7 8 9 A B C D E F

其中 A 表示十进制的 10B 表示十进制的 11,依此类推,F 表示十进制的 15

输入保证每个数字字符串在对应进制下合法。

请你把这 n 个数按照它们的十进制数值从小到大排序。

如果两个数转换成十进制后的数值相等,则需要保持它们在输入中的先后顺序。

注意:数字字符串 s 可能包含前导零。例如:

10 0012

10 12

表示的数值相同,都是十进制的 12

下面给出一份带有 bug 无法通过测试用例的代码,请你修改这份代码的 bug 或者是自己写出完整正确的代码

#include <bits/stdc++.h>
using namespace std;

struct Item {
    int base;
    string s;
    int id;
    int value;
};

int convertToDecimal(int base, const string& s) {
    int value = 0;

    for (char c : s) {
        int digit;

        if (c >= '0' && c <= '9') {
            digit = c - '0';
        } else {
            digit = c - 'A' + 10;
        }

        value += digit;
        value *= base;
    }

    return value;
}

bool cmp(const Item& x, const Item& y) {
    if (x.value != y.value) {
        return x.value < y.value;
    }
    return x.id > y.id;
}

int main() {
    int n;
    cin >> n;

    vector<Item> a(n);

    for (int i = 0; i < n; i++) {
        cin >> a[i].base >> a[i].s;
        a[i].id = i;
        a[i].value = convertToDecimal(a[i].base, a[i].s);
    }

    sort(a.begin(), a.end(), cmp);

    for (auto& item : a) {
        cout << item.base << " " << item.s << endl;
    }

    return 0;
}

输入格式

第一行输入一个整数 n,表示数字个数。

接下来 n 行,每行输入一个整数 b 和一个字符串 s,表示一个 b 进制下的非负整数。

输出格式

按照十进制数值从小到大的顺序输出这 n 个数。

每行输出一个数的原始形式:

b s

如果两个数的十进制数值相同,则按照它们在输入中的顺序输出。

样例

输入

3
16 1
2 111
10 8

输出

16 1
2 111
10 8

提示

1n21041 \le n \le 2 * 10^4 2b162 \le b \le 16 1s.length601 \le s.length \le 60

输入保证: ssbb 进制下合法 所有数转换成十进制后的值不超过 101810^{18}