链接
https://pintia.cn/problem-sets/994805342720868352/problems/994805449625288704
题解
不能直接按照字典序升序,比如:
2 3 32
直接按字典序升序答案是
332
332
332,而实际上答案是
323
323
323
这种错误容易出现在一个串是另一个串的子串的时候
那我强行把短的串放在后面行吗?也有反例:
2 3 34
答案是
334
334
334而不是
343
343
343
所以我可以对一个串是另一个串的情况做特判,如果
a
a
a是
b
b
b的字串,那么小于号规定为
a
+
b
<
b
+
a
a+b<b+a
a+b<b+a,其中加号是字符串连接
最后发现,当一个串不是另一个串的子串时,这个判断方法相当于直接按字典序比较,因此最后我们可以直接把特判去掉干脆对所有的串都这么比较
代码
#include <bits/stdc++.h>
#define maxn 10010
using namespace std;
int N;
string s[maxn], ans;
bool cmp(string a, string b)
{
return a+b<b+a;
}
int main()
{
int i;
cin>>N;
for(i=0;i<N;i++)cin>>s[i];
sort(s,s+N,cmp);
for(i=0;i<N;i++)ans=ans+s[i];
for(i=0;i<ans.length() and ans[i]==48;i++);
if(i==ans.length())putchar(48);
for(;i<ans.length();i++)putchar(ans[i]);
return 0;
}