好中缀

好中缀

我们称一个字符串S的子串T为好中缀,如果T是去除S中满足如下条件的两个子串p和q后剩余的字符串。

(1)p是S的前缀,q是S的后缀;

(2)p=q;

(3)p和q是满足条件(1)(2)的所有子串中的第二长者。

注意一个字符串不能称为自己的前缀或后缀。好中缀至少为空串,其长度大于等于0,不能为负数。

输入格式:

输入为一个字符串S,包含不超过100000个字母。

输出格式:

输出为一个整数,表示好中缀的长度。

输入样例1:

abcabcxxxabcabc

输出样例1:

9

输入样例2:

xacbacba

输出样例2:

8

输入样例3:

aaa

输出样例3:

1

输入样例4:

aaaaa

输出样例4:

0

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1000010;
char p[N];
int n,ne[N];

int main()
{
    cin>>p+1;
    n=strlen(p+1);
    for(int i=2,j=0;i<=n;i++)  //对本串构造出next数组,                     
    {                         //也就是最的长前缀等于后缀
        while(j&&p[i]!=p[j+1]) j=ne[j];
        if(p[i]==p[j+1]) j++;
        ne[i]=j;
    }
    int x=n-2*ne[ne[n]];    //  不明白可以手动模拟一下,第二长的前缀
    cout<<(x=x>=0?x:0)<<endl;
    return 0;
}

posted @ 2023-05-11 10:32  三枪一个麻辣烫  阅读(25)  评论(0)    收藏  举报