(模板)poj3461(kmp模板题)

℡╲_俬逩灬. 提交于 2019-12-03 07:16:06

题目链接: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;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!