题解:
首先我们写一个Manacher模板。。
然后我们可以把所有回文串的信息映射到左端点上,
每个点依此维护最长右连接回文串。
然后再顺着扫一遍就出解了。
代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 101000 using namespace std; char ts[N],s[N<<1]; int n,len,p[N<<1]; void manacher() { int i,j,k,mx=0,id; scanf("%s",ts+1); n=strlen(ts+1),len=n*2+1; s[0]='*',s[1]='~'; for(i=1;i<=n;i++)s[i*2]=ts[i],s[i*2+1]='~'; for(i=1;i<=len;i++) { if(mx>i)p[i]=min(p[id*2-i],mx-i); else p[i]=1; while(s[i-p[i]]==s[i+p[i]])p[i]++; if(mx<i+p[i])mx=i+p[i],id=i; } return ; } int mx[N<<1],id,ans; void ex_manacher() { int i,j,k; for(i=1;i<=len;i++)mx[i]=i; for(i=0;i<=len;i++)mx[i-p[i]]=max(mx[i-p[i]],i); for(i=0;i<=len;i++) { mx[i]=max(mx[i],id); id=mx[i]; } for(i=0;i<=len;i++)ans=max(ans,mx[i+p[i]-1]-i); return ; } int main() { // freopen("test.in","r",stdin); manacher(); ex_manacher(); printf("%d\n",ans); return 0; }
复制去Google翻译翻译结果
时间: 2024-10-13 08:22:53