poj 2752 (summerIII seek the name,seek the fame)

来源:互联网 发布:使命召唤11优化怎么样 编辑:程序博客网 时间:2024/06/11 16:43
这道题真的加深了我对next数组的理解,。没想除了用在KMP上还能有这种操作。。。开始想着用其中的K的值做,因为根据定义,k代表的是最长相同的前后缀长度。。。然后不知道为什么WA。。。。后来百度了一下别人的做法恍然大悟,觉得精妙无比。就是通过递归next数组然后求得前后缀的长度。

以下为链接点击打开链接

AC代码:
#include<cstdio>#include<cstring>#include<string.h>#include<iostream>using namespace std;const int maxn=400000+50;char str[maxn];int sum[maxn],next[maxn],num;void makeNext(const char P[],int next[]){    int q,k;    int m=strlen(P);next[0]=0;    for(q=1,k=0;q<m;++q)    {        while(k>0&&P[q]!=P[k])            k=next[k-1];        if(P[q]==P[k])            k++;        next[q]=k;    }    for(int i=m;i>0;)    {        num++;        //cout<<"next:"<<next[i-1]<<endl;        sum[num]=next[i-1];///每次都忘记这里要减一,字符串最后一位为‘\0’;        i=next[i-1];    }}int main(){    while(scanf("%s",str)!=EOF)    {        int len=strlen(str);        num=0;    memset(next,0,sizeof(next));    memset(sum,0,sizeof(sum));    makeNext(str,next);    for(int i=num-1;i>=1;i--)        printf("%d ",sum[i]);        printf("%d\n",len);    }    return 0;}