• KMP算法


    学习资料:http://www.cnblogs.com/SYCstudio/p/7194315.html

    例题1:洛谷3375:https://www.luogu.org/problemnew/lists?name=3375

    解:

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    using namespace std;
    const int maxn=1000000+10;
    char s1[maxn],s2[maxn];
    int nex[maxn],len1,len2;
    void getnext()
    {
        nex[0]=-1;
        int j=nex[0];
        for(int i=1;i<len2;i++)
        {
            while(j>=0&&s2[j+1]!=s2[i])
                j=nex[j];
            if(s2[j+1]==s2[i])
                 j++;
            nex[i]=j;
        }
    }
    void solve()
    {
        int k=-1;
        for(int i=0;i<len1;i++)
        {
            while(s2[k+1]!=s1[i]&&k!=-1)
            {
                k=nex[k];
            }
            if(s2[k+1]==s1[i])
                 k++;
            if(k==len2-1)
            {
                printf("%d
    ",i-len2+2);
                k=-1;i=i-len2+1;
            }
        }
    }
    int main()
    {
        scanf("%s",s1);
        scanf("%s",s2);
        len1=strlen(s1);
        len2=strlen(s2);
        getnext();
        solve();
        for(int i=0;i<len2;i++)
            printf("%d%c",nex[i]+1," 
    "[i==len2-1]);
        return 0;
    }
    View Code
  • 相关阅读:
    2014-04-23 总结
    14-5-13
    PHP
    14-5-8
    ajax
    14-5-6
    14-5-5
    PHP初解
    14-4-30
    14-4-29
  • 原文地址:https://www.cnblogs.com/carcar/p/8953925.html
Copyright © 2020-2023  润新知