美文网首页
[kuangbin带你飞]专题十六 KMP & 扩展KMP &

[kuangbin带你飞]专题十六 KMP & 扩展KMP &

作者: jenye_ | 来源:发表于2018-08-01 14:38 被阅读0次

    思路

    KMP的next数组的性质。

    • 最小循环节length=plen-next[len]。
    • 通过是否整除判断是否完全循环

    AC代码

    #include<iostream>
    using namespace std;
    const int MAXN=10000002;
    
    string P;
    string T;
    
    int NEXT[MAXN];
    int plen,tlen;
    void getNEXT(){
        NEXT[0] = -1;
        int k = -1 ;
        int j = 0 ;
        while(j<plen){
            if(k==-1||P[k]==P[j]){
                NEXT[++j] = ++k;
            }else{
                k = NEXT[k];
            }
        }
        
    }
    
    int main(){
        
        ios::sync_with_stdio(false);
        int N;
        int ccase = 1;
        while(cin>>N&&N!=0){
            cin>>P;
            plen=N;
            getNEXT();
            cout<<"Test case #"<<ccase++<<"\n";
            for(int i = 2;i<=plen;i++){
                int length = i - NEXT[i];
                if(length!=i&&i%length==0){
                    cout<<i<<" "<<i/length<<"\n";
                }
            }
            cout<<"\n";
        }       
        return 0;
    } 
    

    相关文章

      网友评论

          本文标题:[kuangbin带你飞]专题十六 KMP & 扩展KMP &

          本文链接:https://www.haomeiwen.com/subject/jvfrvftx.html