#include<iostream> #include<string.h> #include<stdio.h> using namespace std; int next[50005]; char s[50005],t[50005]; void getnext()//next[]陣列,next[j]的值表示P[0...j-1]中最長字尾的長度等於相同字元序列的字首。 { int i=0,k=-1; next[0]=-1; int len=strlen(s); while(i<len) { if(s[i]==s[k]||k==-1) { i++; k++; next[i]=k; } else k=next[k]; } /* for(int j=0;j<=len;j++) printf("%d ",next[j]); printf("\n"); 輸出next陣列*/ } void kmp() { int i=0,j=0; int lens=strlen(s); int lent=strlen(t); while(i<lent&&j<lent) { if(s[j]==t[i]||j==-1) { i++; j++; } else j=next[j]; } if(!j) printf("0\n"); else { s[j]='\0'; printf("%s %d\n",s,j); } } int main() { while(scanf("%s%s",s,t)>0) { getnext(); kmp(); } return 0; } /*思路:這題是有兩個字串,要第一個字串的最長字首等於第二個字串的最長字尾。 這樣,根據kmp中next的特性,可以將第一個字串當作模式串(因為要求它的最長字首), 第二個字串當作主串,對兩者進行kmp匹配。這樣,當主串的i不斷往後,而j要是都不匹配的話, 會在-1和0之間往復,當i到了主串後面,開始和模式串匹配時,就可以根據next函式的特性來判斷出字首與字尾相等的最長長度。*/