seek

题目:

俗话说“好命不如好名”,小h准备给他的宠物狗起个新的名字,于是他把一些英文的名字全抄下来了,写成一行长长的字符串,小h觉得一个名字如果是好名字,那么这个名字在这个串中既是前缀,又是后缀,即是这个名字从前面开始可以匹配,从后面开始也可以匹配,例如abc在 abcddabc中既是前缀,也是后缀,而ab就不是,可是长达4*10^5的字符让小h几乎昏过去了,为了给自己的小狗起个好名字,小h向你求救,并且他要求要将所有的好名字的长度都输出来。

输入:

一行,要处理的字符串(都是小写字母)

输出:

一行若干个数字,从小到大输出,表示好名字的长度

样例:


abcddabc

3 8

KMP

求出KMP中的next数组,在求一下next[strlen(s)-1]的方案

#include<cstdio>
#include<cstring>
using namespace std;
char b[500010];
int n,m,a[500010],f[500010],cnt=0;

int main()
{
    scanf("%s",&b);
    n=strlen(b);
    f[0]=-1;
    int j=-1;
    for (int i=1;i<=n;i++)
    {
        j=f[i-1];
        while (b[j+1]!=b[i]&&j!=-1) j=f[j];
        if (b[j+1]==b[i]) f[i]=j+1;
        else f[i]=-1;
    }
    j=f[n-1];
    while (j>=0)
    {
        if (b[j]==b[n-1]) a[++cnt]=j+1;
        j=f[j];
    }
    for (int i=cnt;i>=1;i--)
        printf("%d ",a[i]);
    printf("%d\n",n);
}

猜你喜欢

转载自www.cnblogs.com/nibabadeboke/p/11346000.html