给两个字符串s1,s2,求最长的s1前缀匹配s2后缀的字符串,以及长度
思路:
利用KMP看下最终匹配到了哪个位置;一个是利用常规匹配,另一个是利用next数组的跳转。
#include<bits/stdc++.h> using namespace std; const int N=5e4+10; int lens1,lens2,Next[N]; char s1[N],s2[N]; void GetNext() { int i,j; Next[0]=-1; i=0; j=-1; while(i<lens1) { if(j==-1||s1[i]==s1[j]) Next[++i]=++j; else j=Next[j]; } } void Kmp() { int i,j; i=0;j=0; while(i<lens2) { if(j==-1||s1[j]==s2[i]) { i++;j++; } else j=Next[j]; } if(!j) printf("%d ",j); else { for(int k=0;k<j;k++) printf("%c",s1[k]); printf(" %d ",j); } } int main() { while(~scanf("%s%s",s1,s2)) { lens1=strlen(s1); lens2=strlen(s2); GetNext(); Kmp(); } return 0; }