最简单的KMP题,找出第一个字符串在第二个字符串中出现次数
#include <iostream> 点击打开链接
#include <cstdio>
#include <cstring>
#define Memset(x, a) memset(x, a, sizeof(x))
using namespace std;
const int N=1e6+10;
char w[N],t[N];
int next[N];
int sum;
void getNext(const char P[],int next[]){
int m=strlen(P);
int i=0,j;
j=next[0]=-1;
while(i<m){
while(-1!=j && P[i]!=P[j])j=next[j];
next[++i]=++j;
}
}
void kmp(const char T[],const char P[],int next[]){
int n=strlen(T),m=strlen(P);
int i,j;
getNext(P,next);
i=j=0;
while(i<n){
while(-1!=j && T[i]!=P[j])j=next[j];
i++;j++;
if(j>=m){
sum++;
j=next[j];//这儿修改很重要,不然会超时
}
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
sum=0;
Memset(next,0);
scanf("%s%s",w,t);
kmp(t,w,next);
printf("%d\n",sum);
}
return 0;
}