POJ2752 - Seek the Name, Seek the Fame(KMP)

题目大意

给定一个字符串S,求出所有既是S的前缀又是S的后缀的子串长度

题解

从末尾位置倒推,经过的失配函数值就是题目要求求的

代码:

#include <iostream>

#include <cstdio>

#include <cstring>

#include <algorithm>

#include <vector>

using namespace std;

#define  MAXN 400005

int f[MAXN];

char p[MAXN];

int main()

{

    int j;

    while(scanf("%s",p)!=EOF)

    {

        vector<int> ivec;

        int len=strlen(p);

        f[0]=j=-1;

        for(int i=1;i<len;i++)

        {

            while(j>=0&&p[j+1]!=p[i]) j=f[j];

            if(p[j+1]==p[i]) j++;

            f[i]=j;

        }

        j=len-1;

        ivec.push_back(len);

        while(f[j]>=0) 

        {

            ivec.push_back(f[j]+1);

            j=f[j];

        }

        for(int i=ivec.size()-1;i>=0;i--)

            printf("%d ",ivec[i]);

        printf("\n");

    }

    return 0;

}

你可能感兴趣的:(name)