POJ2752

题目大意

给定一个字符串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("
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zjbztianya/p/3326470.html