求母串里有多少个子串。。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char p[1000050],s[1000050];
int next[1000050];
int n1,n2;
void getnext()
{
int k=-1,j=0;
next[0]=-1;
while(j<n1){
if(k==-1 || p[k] == p[j]){
k++;
j++;
next[j]=k;
}
else {
k=next[k];
}
}
}
int com()
{
int i=0,j=0,sum=0;
while(i<n1){
if(p[i]==s[j] || j==-1)//j==-1,是因为当p[0]!=s[0]时,j=next[j],j就变为-1了,next[-1]无意义
{
i++;j++;
}
else
j=next[j];//next[]数组的意义就是,当 当前的子串和母串的 字符 不相同时,子串游标下一步所指向的位置,即j=next[j];
if(j==n2){
sum++;
j=next[j];
}
}
return sum;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
memset(next,0,sizeof(next));
int i,j,k;
scanf("%s",s);
scanf("%s",p);
n1=strlen(p);
n2=strlen(s);
getnext();
int ans=com();
printf("%d\n",ans);
}
}