POJ_2752_Seek the Name, Seek the Fame

/*

题意:求公共前缀和后缀相同的部分是什么

Input:

ababcababababcabab

aaaaa



Output:

2 4 9 18

1 2 3 4 5

*/

#include<iostream>

#include<cstring>

#include<string>

#include<cmath>

#include<cstdio>

#include<algorithm>

#include<vector>

using namespace std;

#define M 400005

int lena,lenb,Max;

int nt[M];

char b[M];

void getnt(char *b)

{

    int j=0,k=-1;

    nt[0]=-1;

    while(j<lenb)

    {

        if(k==-1||b[j]==b[k])   //此举旨在找寻B串中重复的东东

        {

            k++,j++;

            //如果下一个b[j]不等于b[k],那下一次nt[j]要回到k的位置,这是高速回位的方法

            nt[j]=k;

        }

        else k=nt[k];

    }

    /*for(int i=0; i<=lenb; ++i)

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

    puts("");*/

}

void dfs(int mark)

{

    if(mark==0) return;

    dfs(nt[mark]); 

    printf("%d ",mark);

}

int main()

{

    while(~scanf("%s",b))

    {

        lenb=strlen(b);

        getnt(b);

        dfs(nt[lenb]);

        printf("%d\n",lenb); 

    }

}

 

你可能感兴趣的:(name)