题目链接: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;
}
01-07 18:54