字符串专题:F - Oulipo (A包含多少次B?KMP)

时间:2021-03-29 22:12:11
#include<cstdio>
#include<cstring>
char a[1000000+5],b[10000+5];
int next[10000+5],n,m;

//题意:A串是否包含B串,包含多少次。
//kmp完全匹配。。。注意next[i]=j中保存的是:b[]中以第i个数(b[i-1])结尾的前j个数(包括b[i-1])匹配b[]的前j个数。。
//即 next[i]=j ->m b[i-j …… i-1]=b[0 …… j-1] ;

void getnext(){
int i=0,j=-1;
next[0]=-1;
while(b[i]){
if(j==-1 || b[i]==b[j]){
next[++i]=++j;
}
else
j=next[j];
}
}

int kmp(){
int i=0,j=0,tot=0;
while(i<n){
if(j==-1 || a[i]==b[j]){
i++;j++;
}
else
j=next[j];
if(j==m) tot++;//补充:每次找到的位置为(i-j+1);
}
return tot;
}

int main()
{
int t,i;
scanf("%d",&t);
while(t--){
memset(next,0,sizeof(next));
scanf("%s",b);m=strlen(b);
scanf("%s",a);n=strlen(a);
getnext();
printf("%d\n",kmp());
}
return 0;
}