社区讨论
WA37分 求调
P4555[国家集训队] 最长双回文串参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mlhts06b
- 此快照首次捕获于
- 2026/02/11 17:26 4 周前
- 此快照最后确认于
- 2026/02/13 15:00 4 周前
CPP
#include <bits/stdc++.h>
using namespace std;
char a[100010],s[200010],n;
int p[200010],l[200010],r[200010],ans;
int main(){
scanf("%s",a+1);
int sz=strlen(a+1);
s[n]='$';
s[++n]='#';
for(int i=1;i<=sz;i++){
s[++n]=a[i];
s[++n]='#';
}
s[++n]='@';
int mx=0,mxi=0;
for(int i=1;i<=n;i++){
if(mx>i) p[i]=min(p[2*mxi-i],mx-i);
else p[i]=1;
while(s[i-p[i]]==s[i+p[i]]) p[i]++;
if(i+p[i]>mx){
mx=i+p[i];
mxi=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);
}
for(int i=3;i<n;i+=2) l[i]=max(l[i],l[i-2]-2);
for(int i=n-1;i>=3;i-=2) r[i]=max(r[i],r[i+2]-2);
for(int i=3;i<n;i+=2) if(l[i]&&r[i]) ans=max(ans,l[i]+r[i]);
printf("%d\n",ans);
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...