题目的意思就是问字符串1在字符串2中出现了几次,例如
AZA AZAZAZA 第一个字符串就在第二个字符串中出现了3次
#include<algorithm>
#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
using namespace std;
char a[1000003];
char b[10003];
int next1;
void Getnext(char *p,int next[])
{
int k=-1;
int j=0;
next[0]=-1;
int pLen=strlen(p);
while(j<pLen)
{
if(k==-1||p[j]==p[k])
{
++k;
++j;
if(p[j]!=p[k])
next[j]=k;
else
next[j]=next[k];
}
else
k=next[k];
}
}
int KMPSearch(char *s,char *p,int next[])
{
int i=0;
int j=0;
int sum=0;
int pLen=strlen(p);
int sLen=strlen(s);
while(i<sLen)
{
if(j==-1||s[i]==p[j])
{
i++;
j++;
}
else
{
j=next[j];
}
if(j==pLen)
{
sum++;
j=next[j];//回溯
}
}
return sum;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int next[10003];
scanf("%s%s",b,a);
char *aa=&a[0],*bb=&b[0];
Getnext(bb,next);
bb=&b[0];
next1=next[strlen(b)-1];
int nn=KMPSearch(aa,bb,next);
printf("%d\n",nn);
}
}