POJ2752【KMP-next数组含义】

来源:互联网 发布:淘宝新消保规则 编辑:程序博客网 时间:2024/06/16 04:20
题意:
给一个字符串,求满足既是这个字符串的前缀,又是这个字符串的后缀,从小到大输出长度

思路:

细讲next数组含义博文:点我

首先要满足前缀的呀。
KMP的next数组干的是子串最长后缀。

所以从最后一个next一直往前跳,next存的就是最长后缀,知道为0||-1;

//#include<bits/stdc++.h>#include<cstdio>#include<math.h>#include<string.h>#include<algorithm>using namespace std;typedef long long LL;const int N=4e5+10;int Next[N],len;char s[N];//ababcababababcabab//2 4 9 18void GetNext(){        int i=0,j=-1;        Next[0]=-1;        while(i<len)        {            if(j==-1||s[i]==s[j])                Next[++i]=++j;            else                j=Next[j];        }}int ans[N],num;int main(){    while(~scanf("%s",s))    {        len=strlen(s);        GetNext();        int x=len;        num=0;        while(Next[x]!=0&&Next[x]!=-1)        {            ans[num++]=Next[x];            x=Next[x];        }        sort(ans,ans+num);        for(int i=0;i<num;i++)            printf("%d ",ans[i]);        printf("%d\n",len);    }    return 0;}



0 0