kmp(基本操作)

这是一个C++实现的KMP算法,用于字符串匹配。代码中定义了获取next数组的函数`getnxt`和KMP匹配函数`kmp`,在主函数中读取输入并输出匹配次数。
摘要由CSDN通过智能技术生成
#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值