题目:
Description
Dr lee cuts a string S into N pieces,s[1],…,s[N].
Now, Dr lee gives you these N sub-strings: s[1],…s[N]. There might be several possibilities that the string S could be. For example, if Dr. lee gives you three sub-strings {“a”,“ab”,”ac”}, the string S could be “aabac”,”aacab”,”abaac”,…
Your task is to output the lexicographically smallest S.
Input
The first line of the input is a positive integer T. T is the number of the test cases followed.
The first line of each test case is a positive integer N (1 <=N<= 8 ) which represents the number of sub-strings. After that, N lines followed. The i-th line is the i-th sub-string s[i]. Assume that the length of each sub-string is positive and less than 100.
Output
The output of each test is the lexicographically smallest S. No redundant spaces are needed.
Sample Input
1 3 a ab ac
Sample Output
aabac
思路:
一开始以为仅仅一个排序就可以解决问题,但是例如出现ba和b的情况就会出错,次思路不行。
考虑两个子字符串s1,s2结合,结合方式只有s1s2或者s2s1,结合之后长度一定。于是改变排序的条件,
按照两种方式结合之后再进行比较,按照这种规则排序之后只需要将string的数组按照顺序加起来就可以得到结果。
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 5 bool cmp(const string &s1,const string &s2){ 6 return s1+s2<s2+s1; 7 } 8 9 int main(){ 10 int testcases; 11 cin>>testcases; 12 while(testcases--){ 13 int num_of_substring; 14 cin>>num_of_substring; 15 string substrings[num_of_substring],result; 16 for(int i=0;i<num_of_substring;i++) 17 cin>>substrings[i]; 18 sort(substrings,substrings+num_of_substring,cmp); 19 for(int i=0;i<num_of_substring;i++) 20 result=result+substrings[i]; 21 cout<<result<<endl; 22 } 23 return 0; 24 }