#include <stdio.h>
#include <string.h>
void preKmp(char *src, int m, int *rule){
int i=0,j=-1;
rule[0]=j;
while(i<m){
while(j!=-1 && src[j] != src[i])
j=rule[j];
i++,j++;
if(j>=m)
rule[i]=rule[j-1];
else
rule[i]=j;
}
}
int recount=0;
void kmp(char *src, int m, char *dest, int n)
{
int rule[10005];
preKmp(src,m,rule);
int i=0, j=0;
while(i<n){
while(j!=-1 && src[j] != dest[i]){
j = rule[j];
}
i++,j++;
if(j==m){
recount++;
j=rule[j];
}
}
}
char Reg[10005],ori[1000005];
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
recount=0;
scanf("%s%s",&Reg,&ori);//找出reg在ori中出现的次数
kmp(Reg,strlen(Reg),ori,strlen(ori));
printf("%d\n",recount);
}
return 0;
}
KMP求子串出现次数模板
最新推荐文章于 2022-10-21 22:28:27 发布