这份模板是我自己在看了各大KMP模板之后,自己凭记忆写出来的一套模板,虽然细节坑爹,但是感觉又对KMP的认识深刻了一点,而且模板这种东西,一定是自己写的才是最好用的,这样嵌入题目的时候能够清楚地知道自己该改哪些。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<string>
#include<cstring>
#include<algorithm>
#include<fstream>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<iomanip>
#define rep(i,n) for(i=1;i<=n;i++)
#define MM(a,t) memset(a,t,sizeof(a))
#define INF 1e9
typedef long long ll;
#define mod 1000000007
using namespace std;
char st[1000020],tt[100020];
int next[100020];
void NEXT(char T[],int next[]){
int i,j;
next[0]=-1;
int l=strlen(T);
rep(i,l-1){
j=next[i-1];
while(T[i]!=T[j+1] && j>=0) j=next[j];
if(T[i]==T[j+1]) next[i]=j+1;
else next[i]=-1;
}
}
int Count_Kmp(char S[],char T[],int next[]){
int i,j,l1=strlen(T),l2=strlen(S);
int count=0,pos=0,iter=0;
i=0;
while(pos<l1 && iter<l2){
if(S[iter]==T[pos]){
iter++; pos++;
}
else{
if(pos==0){
iter++;
i=iter;
}
else{
int tmp=pos-next[pos-1]-1;
pos=next[pos-1]+1;
i+=tmp;
}
}
if(pos==l1 && (iter-i)==l1){
count++;
int tmp=pos-next[pos-1]-1;
pos=next[pos-1]+1;
i+=tmp;
}
}
return count;
}
int main()
{
int i,j,l,T;
scanf("%d",&T);
while(T--){
scanf("%s%s",&tt,&st);
NEXT(tt,next);
l=strlen(tt);
printf("%d\n",Count_Kmp(st,tt,next));
}
return 0;
}