kmp(基本操作)

来源:互联网 发布:仓鼠用品淘宝 编辑:程序博客网 时间:2024/06/06 12:32
#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;}

原创粉丝点击