好久不交题了,而且发现最近状态恶劣的不行,AC率恶心到不行 ~
这个题代码有点长,但实际思路很简单,qsort 拍一下序,然后,将最长的字符串与最短的字符串搭配,因为一个字符串最多分成两个不同的最长的字符串,所以最长与最短子字符串搭配最多8种情况,枚举出来,其中有一个就是所求的答案。
代码如下:
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> using namespace std; int cmp(const void *a, const void *b) { int size = strlen((char*)a) - strlen((char*)b); if(!size) return strcmp((char*)a, (char*)b); return size; } int main() { #ifdef st freopen("sample.txt", "r", stdin); #endif char a[150][260], b[260], c[260]; int num; scanf("%d",&num); getchar(); getchar(); while(num--) { int ct = 0; memset(a, 0, sizeof(a)); while(1) { gets(a[ct]); if(!strlen(a[ct])) break; ++ct; } qsort(a, ct, sizeof(a[0]), cmp); int flag = 0; if(strlen(a[0]) == strlen(a[1])) { sprintf(b,"%s%s",a[0],a[ct - 1]); sprintf(c,"%s%s",a[ct - 2],a[1]); if(!strcmp(b, c)) // 两个字符串相同说明是所求的完整字符串 flag = 1; if(!flag) { sprintf(b,"%s%s",a[1],a[ct - 1]); sprintf(c,"%s%s",a[ct - 2],a[0]); if(!strcmp(b, c)) flag = 1; } if(!flag) { sprintf(b,"%s%s",a[ct - 1],a[0]); sprintf(c,"%s%s",a[1],a[ct - 2]); if(!strcmp(b, c)) flag = 1; } if(!flag) { sprintf(b,"%s%s",a[ct - 1],a[1]); sprintf(c,"%s%s",a[0],a[ct - 2]); if(!strcmp(b, c)) flag = 1; } if(!flag) { sprintf(b,"%s%s",a[0],a[ct - 1]); sprintf(c,"%s%s",a[1],a[ct - 2]); if(!strcmp(b, c)) flag = 1; } if(!flag) { sprintf(b,"%s%s",a[1],a[ct - 1]); sprintf(c,"%s%s",a[0],a[ct - 2]); if(!strcmp(b, c)) flag = 1; } if(!flag) { sprintf(b,"%s%s",a[ct - 1],a[0]); sprintf(c,"%s%s",a[ct - 2],a[1]); if(!strcmp(b, c)) flag = 1; } if(!flag) { sprintf(b,"%s%s",a[ct - 1],a[1]); sprintf(c,"%s%s",a[ct - 2],a[0]); if(!strcmp(b, c)) flag = 1; } } else sprintf(b,"%s%s",a[ct - 1],a[0]); printf("%s\n",b); if(num) puts(""); } return 0; }