POJ 2752 Seek the Name, Seek the Fame (KMP的next函数,求前缀和后缀的匹配长度)

给一个字符串S,求出所有前缀,使得这个前缀也正好是S的后缀。升序输出所有情况前缀的长度。
KMP中的next[i]的意义就是:前面长度为i的子串的前缀和后缀的最大匹配长度。
明白了next[i],那么这道题就很容易做了

 

复制代码
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;
const int maxn=400005;
char str[maxn];
int next[maxn];
int n;
int ans[maxn];
void getnext(char *str,int len){
    next[0]=-1;
    int i=0,j=-1;
    while(i<len){
        if(j==-1 || str[i]==str[j]){
            i++;j++;
            next[i]=j;
        }
        else
            j=next[j];
    }
}
int main()
{
    while(scanf("%s",str)!=EOF){
        n=strlen(str);
        getnext(str,n);
        int l=next[n];
        int idx=0;
        ans[idx++]=n;
        while(l!=0){
            ans[idx++]=l;
            l=next[l];
        }
        for(int i=idx-1;i>=0;i--){
            if(i==idx-1)
                printf("%d",ans[i]);
            else
                printf(" %d",ans[i]);
        }
        printf("\n");
    }
    return 0;
}
View Code
复制代码

 

posted @   辰曦~文若  阅读(218)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示