#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#define RG register
#define IL inline
#define pi acos(-1.0)
#define ll long long
using namespace std;
int gi() {
char ch=getchar(); int x=0;
while(ch<'0' || ch>'9') ch=getchar();
while(ch>='0' && ch<='9') {x=10*x+ch-'0';ch=getchar();}
return x;
}
int n;
char A[1000010],B[10010];
int nxt[10010];
//编号为i的结点表示正在匹配第i号字符
void getnxt() {
memset(nxt,0,sizeof(nxt));
int lsB=strlen(B),tmp;
for(int i=1; i<lsB; i++) {
tmp=nxt[i-1];
while(tmp && B[tmp]!=B[i]) tmp=nxt[tmp-1];
if(B[tmp]==B[i]) nxt[i]=tmp+1;
else nxt[i]=0;
}
}
int kmp() {
int j=0,lsA=strlen(A),lsB=strlen(B),Ans=0;
for(int i=0; i<lsA; i++) {
while(j>0 && A[i]!=B[j]) j=nxt[j-1];
if(A[i]==B[j]) j++;
else j=0;
if(j==lsB) Ans++,j=nxt[j-1];
}
return Ans;
}
int main() {
n=gi();
while(n--) {
scanf("%s%s", B, A);
getnxt();
printf("%d\n", kmp());
}
return 0;
}
kmp(基本操作)
最新推荐文章于 2022-07-08 10:58:14 发布
这是一个C++实现的KMP算法,用于字符串匹配。代码中定义了获取next数组的函数`getnxt`和KMP匹配函数`kmp`,在主函数中读取输入并输出匹配次数。
摘要由CSDN通过智能技术生成