//字典排序,一開始以為很水,隨便快排完組合下就好了,誰知道有特殊情況,如c,ca,應該是輸出cac而不是c,ca<br />//因此用填充末位的方法處理特殊情況,如c,ca,cda,cc四個字串,將他們轉化成ccccc...(1),caaaaaa....(2),cdaaaaaa....(3),cccccc....(2)<br />//括弧中記錄他們的原始長度,這樣做的原因是為了能用快速排序方便地將字串按字典排序,如果填充後的字串內容相同,那麼比較長度,誰比較長誰排前面<br />//上面例子的答案是ca|cc|c|cda,由這答案不難知道記錄長度的原因<br />#include<iostream><br />#include<cstdio><br />#include<cstring><br />#include<algorithm><br />char ss[801];//最小字典序的字串<br />int t,n,len_sum;<br />struct str//子串結構體<br />{<br />int len;//長度<br />char a[101];//內容<br />}s[8];<br />int cmp_str(const void* a,const void *b)//結構體二級快速排序:先比較字串<br />{<br />struct str* A = (str *) a;<br />struct str* B = (str *) b;<br />if(strcmp(A->a,B->a) != 0)//我不知道為什麼這裡的‘->’不能用‘.’取代,老出錯,這兩個符號有什麼差別的……哪位神人來幫我解釋下<br />return strcmp(A->a,B->a);<br />else<br />return B->len - A->len;//如果字串內容相同則按長度降序排列<br />}<br />int main()<br />{<br />scanf("%d",&t);<br />while(t--)<br />{<br />len_sum = 0;<br />scanf("%d",&n);<br />for(int i = 0;i < n;++i)<br />{<br />scanf("%s",s[i].a);<br />s[i].len = strlen(s[i].a);<br />len_sum += s[i].len;</p><p>for(int j = s[i].len;j < 100;++j)<br />s[i].a[j] = s[i].a[s[i].len-1];//填充尾位<br />}</p><p>qsort(s,n,sizeof(s[0]),cmp_str);//快速排序</p><p>int ix = 0;<br />for(int i = 0;i < n;++i)<br />{<br />for(int j = 0;j < s[i].len;++j)<br />ss[ix++] = s[i].a[j];//組合所有子串<br />}</p><p>for(int i = 0;i < len_sum;++i)<br />printf("%c",ss[i]);<br />printf("/n");<br />}<br />return 0;<br />}<br />