• POJ 2752 KMP中next数组的应用


    题意:
    让你从小到大输出给的字符串中既是前缀又是后缀的子串的长度。
    思路:
    先要了解这个东西:
    KMP中next数组表示的含义:记录着字符串匹配过程中失配情况下可以向前多跳几个字符,它描述的也是子串的对称程度。

    那么我们可以用next数组来乱搞

    怎么个乱搞法呢?
    前缀的next[len]长度的子串和后缀next[len]长度的子串完全相同
    这样就是一个解了。
    我们可以不断地通过next数组向前查找直到0为止。
    sort一下输出解就大功告成啦

    // by SiriusRen
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int next[400500],alen,k,ans[400500];
    char a[400500];
    void get_next(){
        int j=0;next[1]=0;
        for(int i=2;i<=alen;i++){
            while(j&&a[i]!=a[j+1])j=next[j];
            if(a[i]==a[j+1])++j;
            next[i]=j;
        }
    }
    int main(){
        while(~scanf("%s",a+1)){
            k=0;
            alen=strlen(a+1);
            get_next();
            int temp=next[alen];
            while(temp)
            {
                ans[++k]=temp;
                temp=next[temp];
            }
            sort(ans+1,ans+1+k);
            for(int i=1;i<=k;i++)printf("%d ",ans[i]);
            printf("%d
    ",alen);
        }
    }

    这里写图片描述

  • 相关阅读:
    P1312 [NOIP2011 提高组] Mayan 游戏
    Codeforces Round 736
    CF487E Tourists
    荏苒
    数论
    [NOI2009] 二叉查找树 题解
    元素
    线性基
    杂录
    SQL中关于Join、Inner Join、Left Join、Right Join、Full Join、On、 Where区别
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532390.html
Copyright © 2020-2023  润新知