POJ 2752 Seek the Name, Seek the Fame

题意

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

题解

求出 next 数组,答案就是 len, next[len], next[next[len]],...直到为0为止。

const int N=4e5+10;
char s[N];
int ne[N];
int n;

void init()
{
    for(int i=2,j=0;i<=n;i++)
    {
        while(j && s[i] != s[j+1]) j=ne[j];
        if(s[i] == s[j+1]) j++;
        ne[i]=j;
    }
}

void print(int n)
{
    if(n == 0) return;
    print(ne[n]);
    cout<<n<<' ';
}

int main()
{
    while(~scanf("%s",s+1))
    {
        n=strlen(s+1);

        init();

        print(n);
        cout<<endl;
    }
    //system("pause");
}
posted @ 2020-12-14 15:32  Dazzling!  阅读(98)  评论(0编辑  收藏  举报