#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+114;
struct rec{
int l,r,mid;
}z[maxn];
bool cmp(rec a,rec b){
return a.l<b.l;
}
struct trees{
struct tr{
int l,r,m;
}tree[maxn];
void push_up(int i){
tree[i].m=max(tree[i*2].m,tree[i*2+1].m);
}
void build(int i,int l,int r){
tree[i].l=l;tree[i].r=r;
if (l==r){
tree[i].m=z[l].mid;
return ;
}
int mid=(l+r)/2;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
push_up(i);
}
int q_maxn(int i,int l,int r){
if (tree[i].l>=l&&tree[i].r<=r){
return tree[i].m;
}
if (tree[i].l>r||tree[i].r<l){
return -114514;
}
int s=-114514;
if (tree[i*2].r>=l) s=max(s,q_maxn(i*2,l,r));
if (tree[i*2+1].l<=r) s=max(s,q_maxn(i*2+1,l,r));
return s;
}
}t;
int q_q(int l,int r){
return 0;
}
string c;
int a[maxn],p[maxn],r,m,n,mid,ans;
int main(){
cin>>c;
n=c.size();
for (int i=0;i<n;i++){
a[++m]=114514;
a[++m]=a[i];
}
a[++m]=114514;
a[m+1]=1919810;
n=m;
for (int i=1;i<=n;i++){
if (i<r) p[i]=min(p[2*mid-i],p[mid]+mid-i);
while (a[i+p[i]]==a[i-p[i]]) p[i]++;
if (i+p[i]>r){
r=i+p[i];
mid=i;
}
}
for (int i=1;i<=n;i++){
z[i].mid=i;
z[i].r=i+p[i]-1;
z[i].l=i-p[i]+1;
}
sort(z+1,z+1+n,cmp);
t.build(1,1,n);
for (int i=1;i<=n;i++){
int xxx=q_q(i,n);
if (xxx==i) continue;
ans=max(ans,i,t.q_maxn(1,i,xxx));
}
if (ans==0) ans=2;
printf("%d",ans);
return 0;
}
为什会CE啊???????