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\n",alen);
    }
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值