好中缀
我们称一个字符串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;
}