似乎把这题些颓了。
Manacher预处理,得到g[]数组。
之后蒟蒻就开始无脑的用数据结构大法了。。。
慢得飞起
#include <map>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char S[200005];
int minx[800005],tip[800005],g[200005];
int maxl,p,i,N,n,t,ans;
void Manacher(){
maxl=0; p=0; g[0]=0;
for (i=1;i<N;i++){
if (maxl>=i){
if (i+g[p*2-i]<maxl) g[i]=g[p*2-i];
else g[i]=maxl-i;
} else g[i]=0;
while (S[i-g[i]-1]==S[i+g[i]+1]) g[i]++;
if (maxl<i+g[i]) maxl=g[i]+i, p=i;
}
}
void push(int p){
minx[p*2+1] = min(minx[p*2+1],tip[p]);
minx[p*2+2] = min(minx[p*2+2],tip[p]);
tip[p*2+1] = min(tip[p*2+1],tip[p]);
tip[p*2+2] = min(tip[p*2+2],tip[p]);
tip[p] = N+1;
}
void add(int p,int l,int r,int L,int R,int X){
if (r<L || R<l) return;
if (L<=l && R>=r){
minx[p] = min(minx[p],X);
tip[p] = min(tip[p],X);
return;
}
if (tip[p]<=N) push(p);
int mid=(l+r)>>1;
add(p*2+1,l,mid,L,R,X);
add(p*2+2,mid+1,r,L,R,X);
minx[p] = min(minx[p*2+1],minx[p*2+2]);
}
int get(int p,int l,int r,int L,int R){
if (r<L || R<l) return N+1;
if (L<=l && R>=r) return minx[p];
if (tip[p]<=N) push(p);
int mid = (l+r)>>1;
int ret1 = get(p*2+1,l,mid,L,R);
int ret2 = get(p*2+2,mid+1,r,L,R);
return min(ret1,ret2);
}
void work(){
memset(minx,10,sizeof(minx));
memset(tip,10,sizeof(tip));
//add(0,1,N,1,1,1);
for (i=2;i<N;i++){
t=get(0,1,N,i-g[i],i-1);
ans = max(ans, i-t);
add(0,1,N,i,i+g[i],i);
}
printf("%d\n",ans);
}
int main(){
//freopen("2565.in","r",stdin);
//freopen("2565.out","w",stdout);
scanf("%s",S+1);
n=strlen(S+1);
for (i=n*2+1;i>0;i--)
if (i&1) S[i]='#'; else S[i]=S[i/2];
S[0]='*'; S[N=n*2+2]='^';
Manacher();
// for (i=1;i<=N;i++)
// printf("%d %d\n",i,g[i]);
work();
return 0;
}