做这道题的时候,我对KMP也是没有什么概念。。然后学长说,利用next数组就可以。思考了一下,觉得next数组大概是个这么回事:next数组是在第i个字符“失配”的情况下,跳转到next[i]所指向的第j个字符,再进行匹配。这样来看,既然可以跳转,那就说明i前面的字符一直到j后面一个字符这k个字符与j前面的k个字符就是一模一样的!如果不是这样,那么i失配的情况下,就不可以跳到j字符。
#include<stdio.h> #include<string.h> char s1[100005],s2[50005]; int next[100005]; void get_next(char t[100005]) { int i=0,j=-1,len; next[0]=-1; len=strlen(t); while(i<len) { if(j==-1||t[i]==t[j]) {++i; ++j; next[i]=j; } else j=next[j]; } } int main() { int len1,len2,i,j,sum,min; char ch; while(scanf("%s",s1)!=EOF) { ch=getchar(); len1=strlen(s1); gets(s2); len2=strlen(s2); strcat(s1,s2); get_next(s1); i=strlen(s1); if(len1>len2) min=len2; else min=len1; while(i>min&&i>0){ i = next[i]; } s1[i] = '\0'; if(i!=0) printf("%s %d\n",s1,i); else printf("%d\n",i); } return 0; }