zoukankan      html  css  js  c++  java
  • (模板)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;
    }
  • 相关阅读:
    1
    可测试性
    爬取信件信息(更新)
    爬虫爬取疫情数据存到文件
    python分析三国演义中出现次数最多的词作词频统计
    实验三
    scala统计学生成绩
    对于OpenCV的访问Mat元素的探究
    OpenCV+VS2017+Nivdia(待更新)
    Window10 CUDA和cunn安装
  • 原文地址:https://www.cnblogs.com/FrankChen831X/p/11782604.html
Copyright © 2011-2022 走看看