2个字符长合并在一起即可。要注意next[n]的值要小于初始的两个字符串的长度;
//next[]存的是之前相同的长度。 //也是位置,只是s[i]不一定和s[next[i]]相同 //但是i之前的和next[i]之前相同的个数==next[i]; #include<stdio.h> #include<string.h> #define maxn 50010 char s1[maxn*2],s2[maxn]; int next[maxn*2],fs1,fs2,len; void getnext() { int j,k; j=0; k=-1; next[0]=-1; while(j<len) { if(k==-1||s1[j]==s1[k]) { j++; k++; next[j]=k; } else k=next[k]; } } void kmp() { int i,j; getnext(); j=len; while(next[j]>fs1||next[j]>fs2) j=next[j]; if(next[j]==0) printf("0 "); else { for(i=0;i<next[j];i++) printf("%c",s1[i]); printf(" %d ",next[j]); } } int main() { int i,j; while(scanf("%s %s",s1,s2)!=EOF) { fs1=strlen(s1); fs2=strlen(s2); int k=0; strcat(s1,s2); len=fs1+fs2; //printf("%s ",s1); kmp(); } }