选出一个输入顺序,使得输入的次数最少,即前一个字符串与后一个字符串重合的地方可以不打(从头开始,连续的),计算输入次数,并打出输入顺序
思路:
输入顺序就是qsort按strcmp排序的方法,按字典集,其次短的在前
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int n;
char s[105][1005];
int cmp(const void*a, const void*b) {
return strcmp((char*)a, (char*)b);
}
int cal() {
int sum=0;
sum = strlen(s[0]);
for(int i=1; i<n; i++) {
int len = strlen(s[i]);
int k=0;
while(s[i][k]==s[i-1][k] &&k<len && s[i-1][k]) {
k++;
}
sum += (len-k);
}
return sum;
}
int main() {
int kase;
scanf("%d", &kase);
while(kase--) {
scanf("%d", &n);
for(int i=0; i<n; i++) {
scanf("%s", s[i]);
}
qsort(s,n,sizeof(s[0]),cmp);
int ans = cal();
printf("%d\n", ans);
for(int i=0; i<n; i++) {
printf("%s\n", s[i]);
}
}
return 0;
}