8!枚举的,但是其实可以自定义一个cmp给子字符串排序,然后顺序输出子字符串即可得到一个字典序中最小的字符串。
cmp的函数是我自己写的,但是测试了几个用例都没错,放到西西里就WA,然后cmp2是网上参考人家的,觉得写的很好,于是直接拿来用就过了。
cmp2构造了一个等长的字符串,然后基本就是要解决b和ba这种应该让ba排在前面的问题。把两个串按不同顺序加起来再比较就可以很好地解决。
#include<string.h>
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
bool cmp(string a,string b)
{
if(a.size() == b.size())
{
return a.compare(b) < 0;
}
else if(a.size() > b.size())
{
return cmp(a.substr(b.size(),a.size()-b.size()),b);
}
else
{
return cmp(a,b.substr(a.size(),b.size()-a.size()));
}
}
bool cmp2(string a, string b)
{
return a + b < b + a;
}
int main()
{
string str[100];
int t,n;
cin >> t;
for(int i = 0; i < t; i++)
{
cin >> n;
for(int j = 0; j < n; j++)
{
str[j].resize(200);
cin >> str[j];
}
sort(str,str+n,cmp2);
for(int j = 0; j < n; j++)
{
cout << str[j];
}
cout << endl;
}
}