基本思路:先按照长度排序,总长度等于第一个子串加上最后一个子串,然后从最后开始枚举子串与子串file[0]相加,也从后开始找到另一个子串与子串file[1]相加,并交换相加顺序,直到两个先加的串相等。
注意考虑所有子串都相等的特殊情况。
#include<stdio.h> #include<string.h> #include<stdlib.h> #define MAX_LEN 256*8+5 #define MAX_LINE 300 char file[MAX_LINE][MAX_LEN]; int cmp(const void*a, const void*b) { return strlen((char*) a) - strlen((char*) b); } void judge(int n) { qsort(file, n, MAX_LEN * sizeof(char), cmp); int len = strlen(file[0]) + strlen(file[n - 1]); int i, j; char str1[len + 5]; char str2[len + 5]; for (i = n - 1; i > 0; i--) { strcpy(str1, file[0]); strcat(str1, file[i]); for (j = n - 1; j > 1; j--) { if (j == i) continue; strcpy(str2, file[1]); strcat(str2, file[j]); if (strcmp(str1, str2) == 0) { printf("%s\n", str1); return; } } for (j = n - 1; j > 1; j--) { if (j == i) continue; strcpy(str2, file[j]); strcat(str2, file[1]); if (strcmp(str1, str2) == 0) { printf("%s\n", str1); return; } } } for (i = n - 1; i > 0; i--) { strcpy(str1, file[i]); strcat(str1, file[0]); for (j = n - 1; j > 1; j--) { if (j == i) continue; strcpy(str2, file[1]); strcat(str2, file[j]); if (strcmp(str1, str2) == 0) { printf("%s\n", str1); return; } } for (j = n - 1; j > 1; j--) { if (j == i) continue; strcpy(str2, file[j]); strcat(str2, file[1]); if (strcmp(str1, str2) == 0) { printf("%s\n", str1); return; } } } } int main() { int cases; scanf("%d", &cases); getchar(); getchar(); while (cases--) { int i = 0; while (1) { gets(file[i]); if (file[i][0] == 0) break; i++; } judge(i); if (cases) printf("\n"); } return 0; }