【poj2752】Seek the Name, Seek the Fame(KMP)

题目描述

传送门

题解

从后往前不断地找失配即可。

代码

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

const int max_w=400005;

char W[max_w];
int len,T[max_w],ans[max_w],tot;

inline void calc_T(){
    T[0]=-1;
    int j;
    for (int i=0;i<len;++i){
        j=T[i];
        while (j!=-1&&W[i]!=W[j])
          j=T[j];
        T[i+1]=++j;
    }
}

inline void calc_ans(){
    int j=len;
    while (j!=-1){
        ans[++tot]=j;
        j=T[j];
    }
}

int main(){
    while (gets(W)){
        memset(T,0,sizeof(T));
        len=strlen(W);
        calc_T();
        memset(ans,0,sizeof(ans));
        tot=0;
        calc_ans();
        for (int i=tot-1;i>=1;--i)
          printf("%d%c",ans[i]," \n"[i==1]);
    }
}

你可能感兴趣的:(KMP,poj)