• KMP算法


    处理何种问题:求解母串中,是否有模式串/有多少模式串/模式串的位置。

     

    性能:时间复杂度O(T_len+S_len)

     

    原理:通过Next数组来优化的,具体证明过程不知让我丢哪去了,具体证明会形成一个环。

     

    实现步骤:略

     

    备注:ios::sync_with_stdio(false); 有时可以加速cin的输入,但有些oj不行

     

    输入样例解释

    Ababababa    //母串

    Aba    //模式串

     

    输出样例解释

    4    //母串中模式串的个数

    #include<iostream>
    #include<string>
    #include<algorithm>
    using namespace std;
    
    const int MaxN=10010000;
    string T,S;///母串,字串
    int T_len,S_len;///字符串长度
    int Next[MaxN];///传说中的 Next 数组
    
    void GetNext()
    {
        int i,j,k;
    
        i=-1;
        j=0;
        Next[0]=-1;
    
        while(j<S_len)
        {
            if(i==-1||S[i]==S[j])
                Next[++j]=++i;
            else
                i=Next[i];
        }
    }
    
    int KMP()
    {
        int i,j,ans;
    
        j=0;
        ans=0;
    
        for(i=0;i<T_len;++i)
        {
            while(j>0&&T[i]!=S[j])
            {
                j=Next[j];
            }
    
            if(T[i]==S[j])
                ++j;
    
            if(j==S_len)
            {
    
                ///返回主串里有多少个该子串
                j=Next[j];
                ++ans;
    
    
                /**
                ///返回主串里有没有该子串
                ++ans;
                break;
                */
    
                /**
                ///返回字串在主串里的位置
                ans=i-j+2;
                break;
                */
            }
        }
    
        return ans;
    }
    
    int main()
    {
        ios::sync_with_stdio(false);/// cin 输入加速器
    
        while(cin>>T>>S)///输入母串,子串
        {
            T_len=T.size();
            S_len=S.size();
    
            GetNext();
            cout<<KMP()<<endl;
        }
        return 0;
    }
    

      

  • 相关阅读:
    【BZOJ4300】绝世好题
    codeforce1051F
    【BZOJ3329】Xorequ
    codeforce739c
    【UVA11825】
    codeforce6E
    CF 1023D Array Restoration
    BZOJ 1911 [APIO2010] 特别行动队
    POJ 3709 K-Anonymous Sequence
    BZOJ 2726 [SDOI2012] 任务安排
  • 原文地址:https://www.cnblogs.com/l1l1/p/9830035.html
Copyright © 2020-2023  润新知