题意描述不太好,说好是A+B,却可以B+A,虽然理论上是这样,但我觉得题意说清楚些比较好
我的做法和网上的题解不一样,比如asdf sdfg
我把第一个字符串接在第二个的后面,形成
sdfgasdf,长度一共为8,然后找next【8】,next【8】就是最长公共串的长度(为什么是这样,请看题解poj 2752)
然后把第二个字符串接在第一个的后面,再找下,
最后对比下哪个长点,就输出哪个,有个东西不好处理,aaaaaaaa aaa
如果是这样的话,直接输出较长的
#include<stdio.h> #include<string.h> #include<cstring> #define val 100005 int lens,lenp,next[val*2],lenv,Min; char s[val],p[val],an[val*2]; bool in[val*2]; int set_next(); int main() { int i,temp,first,second; while(scanf("%s",s)!=EOF) { scanf("%s",p); lenp=strlen(p); lens=strlen(s); Min=lenp<lens?lenp:lens; lenv=lenp+lens; strncpy(an,p,lenp); strncpy(an+lenp,s,lens); set_next(); first=set_next();//p在前 /* for(i=0;i<=lenv;i++) printf("%d ",next[i]);*/ strncpy(an,s,lens); strncpy(an+lens,p,lenp); second=set_next();//s在前 // printf("FIRST:%d sec:%d\n",first,second); if(first==second) { if(strncmp(s,p,Min)==0) { if(Min==lenp) puts(s); else puts(p); continue; } if(strcmp(p,s)<0) printf("%s%s\n",p,s+second); else printf("%s%s\n",s,p+second); } else if(first>second) { printf("%s%s\n",s,p+first); } else printf("%s%s\n",p,s+second); memset(s,0,sizeof(s)); memset(p,0,sizeof(p)); } return 0; } int set_next() { int k,j; k=-1,j=0; next[j]=k; while(j<lenv) { if(k==-1||an[j]==an[k]) { k++; j++; next[j]=k; } else k=next[k]; } return next[lenv]; }