poj 2752 KMP的next数组应用(prefix-suffix string)

来源:互联网 发布:扇贝背单词软件 编辑:程序博客网 时间:2024/05/02 04:57

题意:给定一个串,求其所有的同为前缀和后缀的子串的长度。

思路:用KMP预处理的next数组就可以解决,时间为O(n)。可以这样想,符合题意的最长的串必为原串,次长度为next[len-1],这是由next数组的定义决定的。再次长度就是对str[0,next[len-1]]这个串去求,也就是next[next[len-1]]这么长。所以递归求下去就可以了。

#include <cstdio>#include <cstring>#define N 400005char s[N];int next[N],len;void getnext(){    int i,k;    next[0] = k = -1;    for(i = 1;i<len;i++){        while(k>-1 && s[k+1]!=s[i])            k = next[k];        if(s[k+1] == s[i])            k++;        next[i] = k;    }}void print(int x){    if(x!=-1){        print(next[x]);        printf("%d ",x+1);    }}int main(){    while(scanf("%s",s) != EOF){        len = (int)strlen(s);        getnext();        print(len-1);        putchar('\n');    }    return 0;}


0 0
原创粉丝点击