题目链接:https://vjudge.net/problem/POJ-3461
题意:给出主串和模式串,求出模式串在主串中出现的次数。
思路:kmp板子题。
AC代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e6+5;
int T,next[maxn],len1,len2;
char s1[maxn],s2[maxn];
//得到next数组
void get_next(){
next[0]=-1;
int j=-1;
for(int i=1;i<len2;++i){
while(j>-1&&s2[j+1]!=s2[i]) j=next[j];
if(s2[j+1]==s2[i]) ++j;
next[i]=j;
}
}
//输出模式串在主串上依次出现的下标
void kmp_index(){
int j=-1;
for(int i=0;i<len1;++i){
while(j>-1&&s1[i]!=s2[j+1]) j=next[j];
if(s1[i]==s2[j+1]) ++j;
if(j==len2-1){
j=next[j];
printf("%d\n",i-len2+1);
}
}
}
//返回模式串在主串上出现的次数
int kmp_count(){
int cnt=0,j=-1;
for(int i=0;i<len1;++i){
while(j>-1&&s1[i]!=s2[j+1]) j=next[j];
if(s1[i]==s2[j+1]) ++j;
if(j==len2-1){
++cnt;
j=next[j];
}
}
return cnt;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%s%s",s2,s1);
len1=strlen(s1);
len2=strlen(s2);
get_next();
printf("%d\n",kmp_count());
}
return 0;
}