kmp;
next数组意义, next[i]表示, 匹配到key[i]失败时,i将回退到next[i]来与主串比较。
#include<cstdio>
#include<string.h>int count;
char p[10005],s[1000005];//开小会WA?
int next[1000005];
int lens, lenp;
void getnext(){
int i=0; int j=-1;
next[0]=-1;
while (i!=lenp){
if (j==-1 || p[i]==p[j])
next[++i]=++j; // 该位匹配了,下一位的next多1,表示下一位匹配失败了,少退回1位
else j=next[j];
}
}
void kmp(){
int i=0, j=0;
while (i!=lens){
if (j==-1 || s[i]==p[j]){
i++; j++;
}
else
j=next[j];
if (j==lenp){
count++;
j=next[j];
}
}
}
int main(){
int n;
scanf("%d", &n);
for (int i=0; i<n; i++){
scanf("%s%s", p, s);
lens=strlen(s);
lenp=strlen(p);
count=0;
getnext();
kmp();
printf("%d\n", count);
}
return 0;
}