#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那里。

我们先考虑简单的情况。
有两个大数:1111122222

显然,最大数字为2222211111

接着,再来看1111111112

我们在比前面时发现都是相同的,但是最后一个不同,第二个比第一个大,所以应为1111211111


最后,有两组数据,解决了,cmp基本就对了。
第一组:

2
240 240240241

第二组:

2
249 249249248

第三组:

2
240 240240240

首先比前面的,发现一样,但是第二个数字没有结束,就从头继续比,直到比完为止。

最终结果:

第一组:

240240241240

第二组:

249249249248

如果是像第三组的话,无论第一个在前面还是在后面,都是240240240240。直接return false就OK了。