//字典排序,一开始以为很水,随便快排完组合下就好了,谁知道有特殊情况,如c,ca,应该是输出cac而不是c,ca //因此用填充末位的方法处理特殊情况,如c,ca,cda,cc四个字符串,将他们转化成ccccc...(1),caaaaaa....(2),cdaaaaaa....(3),cccccc....(2) //括号中记录他们的原始长度,这样做的原因是为了能用快速排序方便地将字符串按字典排序,如果填充后的字符串内容相同,那么比较长度,谁比较长谁排前面 //上面例子的答案是ca|cc|c|cda,由这答案不难知道记录长度的原因 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> char ss[801];//最小字典序的字符串 int t,n,len_sum; struct str//子串结构体 { int len;//长度 char a[101];//内容 }s[8]; int cmp_str(const void* a,const void *b)//结构体二级快速排序:先比较字符串 { struct str* A = (str *) a; struct str* B = (str *) b; if(strcmp(A->a,B->a) != 0)//我不知道为什么这里的‘->’不能用‘.’取代,老出错,这两个符号有什么差别的……哪位神人来帮我解释下 return strcmp(A->a,B->a); else return B->len - A->len;//如果字串内容相同则按长度降序排列 } int main() { scanf("%d",&t); while(t--) { len_sum = 0; scanf("%d",&n); for(int i = 0;i < n;++i) { scanf("%s",s[i].a); s[i].len = strlen(s[i].a); len_sum += s[i].len; for(int j = s[i].len;j < 100;++j) s[i].a[j] = s[i].a[s[i].len-1];//填充尾位 } qsort(s,n,sizeof(s[0]),cmp_str);//快速排序 int ix = 0; for(int i = 0;i < n;++i) { for(int j = 0;j < s[i].len;++j) ss[ix++] = s[i].a[j];//组合所有子串 } for(int i = 0;i < len_sum;++i) printf("%c",ss[i]); printf("/n"); } return 0; }