• (模板)poj3461(kmp模板题)


    题目链接:https://vjudge.net/problem/POJ-3461

    题意:给出主串和模式串,求出模式串在主串中出现的次数。

    思路:kmp板子题。复杂度O(n+m)。

    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){     //注意这里i一定是从1开始
            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
    ",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
    ",kmp_count());
        }
        return 0;
    }
  • 相关阅读:
    find命令进阶(二):对找到的文件执行操作exec
    find命令进阶用法(一)
    find按照文件大小查找
    find命令查找目录
    什么是ppa
    Linux进程管理命令
    [HDOJ4135]Co-prime
    [HDOJ5391]Zball in Tina Town
    [模拟]位运算实现四则运算
    [HDOJ1233]还是畅通工程
  • 原文地址:https://www.cnblogs.com/FrankChen831X/p/11782604.html
Copyright © 2020-2023  润新知