POJ-2752

来源:互联网 发布:linux 制作镜像 编辑:程序博客网 时间:2024/06/01 18:54
//这题是对next数组的理解。
对于长度为len的字符串,由next的定义知:

A[0]A[1]...A[next[len]-1]=A[len-next[len]]...A[len-1]此时A[0]A[1]...A[next[len]-1]

为一个符合条件的前缀

有A[0]A[1]....A[next[next[len]]-1] = A[len-next[next[len] - next[next[len]]]...A[next[len]-1],

故A[0]A[1]....A[next[next[len]]-1]也是一个符合条件的前缀

故从len=>next[len]=>next[next[len]] ....=>直到某个next[]为0均为合法答案 。

AC代码:

#include<stdio.h>#include<string.h>#define max 400005char s[max];int next[max];int len;int a[max];void get_next(){    int i=0;    int j=-1;    next[0]=-1;    while(i<len)    {        if(j==-1||s[i]==s[j])        {            i++;            j++;            next[i]=j;        }        else        {            j=next[j];        }    }}int main(){    while(scanf("%s",s)!=EOF)    {        int i,j;        memset(next,0,sizeof(next));        len=strlen(s);        get_next();        j=next[len];        int cnt=0;        while(j>0)        {            a[cnt++]=j;            j=next[j];        }        for(i=cnt-1;i>=0;i--)        {            printf("%d ",a[i]);        }        printf("%d\n",len);    }    return 0;}
这里有两个博客写KMP的理解,很好:
http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html
http://www.matrix67.com/blog/archives/115/

0 0
原创粉丝点击