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);
    }
}

这里写图片描述

原文地址:https://www.cnblogs.com/SiriusRen/p/6532390.html