zoukankan      html  css  js  c++  java
  • kmp模板

    模板题:https://www.luogu.org/problem/P3375

    学习了kmp算法,虽然不是太懂,贴一个模板先。

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAXN 1000010
    using namespace std;
    char s1[MAXN],s2[MAXN];
    int nxt[MAXN],f[MAXN],len1,len2;
    
    void CalcNext()
    {
        for(int i=2,j=0;i<=len2;i++)
        {
            while(j>0&&s2[i]!=s2[j+1]) j=nxt[j];
            if(s2[i]==s2[j+1]) j++;
            nxt[i]=j;
        }
    }
    
    void Kmp()
    {
        for(int i=1,j=0;i<=len1;i++)
        {
            while(j>0&&(j==len2||s1[i]!=s2[j+1])) j=nxt[j];
            if(s1[i]==s2[j+1]) j++;
            f[i]=j;   //如果f[i]==len2说明s1以第i位结尾的字串和s2成功匹配 
        }
    }
    
    int main()
    {
        scanf("%s %s",s1+1,s2+1);
        len1=strlen(s1+1);
        len2=strlen(s2+1);
        CalcNext();
        Kmp();
        for(int i=1;i<=len1;i++) if(f[i]==len2) printf("%d
    ",i-len2+1);
        for(int i=1;i<=len2;i++) printf("%d ",nxt[i]);
        printf("
    ");
        return 0;
    }
  • 相关阅读:
    第一周作业
    第0次作业
    第三次作业
    第二次作业
    第一次作业
    第零次作业
    第三周作业
    第二周作业
    第一周作业
    关于如何学习计算机
  • 原文地址:https://www.cnblogs.com/BakaCirno/p/11315602.html
Copyright © 2011-2022 走看看