参考了第一篇题解,最后两个点WA了
第十二个点输入是aha,我代码输出3(好像l和r没弄对?)
#include "iostream"
using namespace std;
char a[200005];
int len=0, p[200005], l[200005], r[200005], res=0;
inline void read(){
char ch=getchar();
while(ch>='a' && ch<='z'){
if(len%2==0) a[len++]='#';
else{
a[len++]=ch;
ch=getchar();
}
}
a[len]='#';
a[len+1]='~';
}
void manacher(){
int id=0, mx=0;
for(int i=0;i<=len;i++){
if(mx>i) p[i]=min(p[2*id-i], mx-i);
else p[i]=1;
while(a[i+p[i]]==a[i-p[i]]) p[i]++;
if(i+p[i]>mx) mx=i+p[i], id=i;
l[i-p[i]+1]=max(l[i-p[i]+1], p[i]-1);
r[i+p[i]-1]=max(r[i+p[i]-1], p[i]-1);
}
}
int main(){
read();
manacher();
for(int i=len;i>=0; i-=2) r[i] = max(r[i], r[i + 2] - 2);
for(int i=0; i<=len; i+=2) l[i] = max(l[i], l[i - 2] - 2);
for(int i=0;i<=len;i+=2){
res=max(res, l[i]+r[i]);
}printf("%d\n", res);
// cout << a << "\n";
// cout << "p[]";
// for(int i=0;i<=len;i++) printf(" %2d", p[i]);
// cout << "\nl[]";
// for(int i=0;i<=len;i++) printf(" %2d", l[i]);
// cout << "\nr[]";
// for(int i=0;i<=len;i++) printf(" %2d", r[i]);
// cout << "\nans=max(ans, r[i]+l[i])";
}