查找一个模式串在其他串中出现的次数;
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; char W[10010],T[1000010]; int wlen,tlen; int nex[10010]; void getNext() { int j,k; j=0; k=-1; nex[0]=-1; while(j<wlen) { if(k==-1||W[j]==W[k]) { nex[++j]=++k; } else k=nex[k]; } } int KMP_count() { int ans=0; int i,j=0; if(wlen==1&&tlen==1) { if(W[0]==T[0])return 1; else return 0; } getNext(); for(i=0;i<tlen;i++) { while(j>0&&T[i]!=W[j]) j=nex[j]; if(W[j]==T[i])j++; if(j==wlen) { ans++; j=nex[j]; } } return ans; } int main() { int tcase; scanf("%d",&tcase); while(tcase--) { scanf("%s%s",&W,&T); wlen=strlen(W); tlen=strlen(T); printf("%d ",KMP_count()); } return 0; }