个人觉得这个题的输入模式不好,我开始的时候就没看懂,什么又是end of file又是case 的。压根就没搞懂怎么样子结束。
看了人家的读取语句,我照着写了下来。
思路: 就是按照字符串长度排序, 用最短的开始找与它长度可以满足lenth的字符串,然后判断即可。
我的判断程序可能写的耗时了,程序跑了12ms。我看一个大牛的代码经过不断优化最后跑了4ms。
其实这个题的数组很规范,所以我们可以小偷懒一下,没必要完全回复,完全验证。
我的代码:
#include <cstdio> #include <cstring> #include <cstdlib> char st[200][300], aim[300]; int c, len; int comp(const void *a,const void *b) { char *c = (char*)a, *d = (char*)b; return strlen(c)-strlen(d); } int is_ok(char *A) { int L, yes; for(int i = 0; i < c; i++) { yes = 1; L = strlen(st[i]); for(int j = 0; j < L; j++) if(st[i][j]!=A[j]) { yes = 0; break;} if(yes) continue; else yes = 1; for(int j = 0; j < L; j++) if(st[i][L-1-j]!=A[len-1-j]) {yes = 0; break;} if(yes) continue; else return 0; } return 1; } int main () { int t; scanf("%d",&t);getchar(); getchar(); while(t--) { c = 0; while(gets(st[c])&&st[c][0]!=0) c++; qsort(st,c,sizeof(st[0]),comp); len = strlen(st[0])+strlen(st[c-1]); for(int i = c-1;i >= 0; i--) if(strlen(st[i])==len-strlen(st[0])) { strcpy(aim,st[0]); strcat(aim,st[i]); if(is_ok(aim)) {printf("%s\n",aim); break;} strcpy(aim,st[i]); strcat(aim,st[0]); if(is_ok(aim)) {printf("%s\n",aim); break;} } if(t) printf("\n"); } return 0; }再贴一下4ms的代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> char s[160][260],p[260],q[260]; int cmp(const void *a,const void *b) { return strlen((char *)a)-strlen((char *)b); } int judge(int n,int len) { int i,j,f; j=1; f=0; for(i=1;i<n;i++) { if(strlen(s[i])!=len-strlen(s[j])) continue; strcpy(q,s[j]); strcpy(q+strlen(s[j]),s[i]); if(strcmp(p,q)==0) return 1; strcpy(q,s[i]); strcpy(q+strlen(s[i]),s[j]); if(strcmp(p,q)==0) return 1; } return 0; } int main() { int T,cnt,i,min,max; scanf("%d",&T); gets(s[0]); getchar(); while(T--) { cnt=0; while(gets(s[cnt])&& s[cnt][0]!=0) cnt++; qsort(s,cnt,sizeof(s[0]),cmp); min=strlen(s[0]); max=strlen(s[cnt-1]); for(i=cnt-1;i>=0 && strlen(s[i])==max;i--) { strcpy(p,s[0]); strcpy(p+strlen(s[0]),s[i]); if(judge(cnt,min+max)) break; strcpy(p,s[i]); strcpy(p+strlen(s[i]),s[0]); if(judge(cnt,min+max)) break; } printf("%s\n",p); if(T) printf("\n"); } return 0; }