#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了。