当模式串j达到len时表示匹配到了一个
这时候将j=next[j]代表着把j移到整个模式串最长前缀后缀,这样可以保证j以上next[j]个字符一定是匹配的
然后继续寻找就能得到答案
题目代码
#include<stdio.h> #include<string.h> using namespace std; const int maxn=1e6+7; const int maxm=1e4+7; char a[maxn],b[maxm]; int t,nxt[maxm],tot; void GetNext(char *p){ int len=strlen(p); int root=0; int j=0,k=-1; nxt[0]=-1; while(j<len){ if(k==-1||p[j]==p[k]){ j++;k++; nxt[j]=k; } else k=nxt[k]; } } int KmpSearch(char *s,char *t){ int slen=strlen(s),tlen=strlen(t); int i=0,j=0,sum=0; while(i<slen){ if(j==-1||a[i]==b[j]){ i++;j++; } else j=nxt[j]; if(j==tlen){ sum++; j=nxt[j]; } } return sum; } int main(){ scanf("%d",&t); while(t--){ tot=0; scanf("%s%s",&b,&a); GetNext(b); printf("%d ",KmpSearch(a,b)); } return 0; }