题意:打印一些单词,求出最少打印字母数量,第一个单词最先打印。
题解:直接模拟,每次都找和上一个单词最接近的打印。
#include <stdio.h>
#include <string.h>
const int N = 105;
int main() {
int t, n, ans, flag[N], vis[N], maxlen;
char s[N][N];
scanf("%d", &t);
while (t--) {
ans = 0;
memset(vis, 0, sizeof(vis));
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%s", s[i]);
ans += strlen(s[0]);
flag[0] = 0;
for (int i = 1; i < n; i++) {
maxlen = 0;
for (int j = 1; j < n; j++) {
if (vis[j])
continue;
int len = strlen(s[flag[i - 1]]), temp = 0;
for (int k = 0; k < len; k++) {
if (s[j][k] == s[flag[i - 1]][k])
temp++;
else
break;
}
if (maxlen <= temp) {
maxlen = temp;
flag[i] = j;
}
}
vis[flag[i]] = 1;
ans += strlen(s[flag[i]]) - maxlen;
}
printf("%d\n", ans);
for (int i = 0; i < n; i++)
puts(s[flag[i]]);
}
return 0;
}