#include <cstdio>
#include <string>
#include <algorithm>
#include <iostream>
bool cmp(std::string x, std::string y) {
int max = x.size() > y.size() ? x.size() : y.size();
int min = x.size() < y.size() ? x.size() : y.size();
for (int i = 0, j = 0; j < max; i = (i + 1) % min, ++j) {
if (x.size() < y.size()) {
if (x[i] < y[j]) return false;
if (x[i] > y[j]) return true;
} else {
if (x[j] < y[i]) return false;
if (x[j] > y[i]) return true;
}
}
return false;
}
int main() {
int n;
scanf ("%d", &n);
std::string st[n + 1];
for (int i = 1; i <= n; ++i)
std::cin >> st[i];
std::sort(st + 1, st + n + 1, cmp);
for (int i = 1; i <= n; ++i)
std::cout << st[i];
}主要难点就在cmp那里。
我们先考虑简单的情况。
有两个大数:11111、22222
显然,最大数字为2222211111
接着,再来看11111、11112
我们在比前面时发现都是相同的,但是最后一个不同,第二个比第一个大,所以应为1111211111。
最后,有两组数据,解决了,cmp基本就对了。
第一组:
2 240 240240241
第二组:
2 249 249249248
第三组:
2 240 240240240
首先比前面的,发现一样,但是第二个数字没有结束,就从头继续比,直到比完为止。
最终结果:
第一组:
240240241240
第二组:
249249249248
如果是像第三组的话,无论第一个在前面还是在后面,都是240240240240。直接return false就OK了。

京公网安备 11010502036488号