悲剧,,已经记不清写这道题写了几天了,,,,总之就是一直不断的wr,,,然后一直不断的找漏洞,,,,刚才才明白,,原来调用KMP函数时,,j的值就是匹配的长度,,,而我之前却在绞尽脑汁的想这么求匹配的长度。。。。。。。这让我情何以堪!!!!!!!!!!用两次KMP,比较一下两次匹配长度即可。题目:
asdf sdfg asdf ghjk
asdfg asdfghjk
#include <iostream> #include <string.h> #include <cstdio> const int N=100010; int nextt[N]; using namespace std; void get_next(char s[]) { int i=1,j=0; int len=strlen(s); nextt[0]=-1; while(i<len){ if(j==-1||s[i]==s[j]){ ++i;++j;nextt[i]=j; } else j=nextt[j]; } } int kmp(char ss[],char s[]){ int len1=strlen(ss); int len2=strlen(s); get_next(s); int i=0,j=0; while(i<len1&&j<len2){ if(j==-1||ss[i]==s[j]){ ++i;++j; } else j=nextt[j]; } if(i==len1) return j; else return 0; } int main(){ //freopen("1.txt","r",stdin); char str1[N],str2[N]; while(scanf("%s%s",str1,str2)!=EOF){ int x=kmp(str1,str2); int y=kmp(str2,str1); //printf("x==%d y==%d\n",x,y); if(x==y){ if(strcmp(str1,str2)>0){ printf("%s",str2); printf("%s\n",str1+x); } else{ printf("%s",str1); printf("%s\n",str2+x); } } else if(x>y){ printf("%s",str1); printf("%s\n",str2+x); } else{ printf("%s",str2); printf("%s\n",str1+y); } } return 0; }