社区讨论
求条,悬1关
P4555[国家集训队] 最长双回文串参与者 4已保存回复 16
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 16 条
- 当前快照
- 1 份
- 快照标识符
- @mm68xp7p
- 此快照首次捕获于
- 2026/02/28 19:37 上周
- 此快照最后确认于
- 2026/03/02 21:00 上周
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=200005;
int ll[maxn];
int rr[maxn];
int a[maxn];
int n;
int ans;
string s;
void manacher(){
string t="%#";
int l;
for(int i=0;i<n;i++){
t+=s[i];
t+="#";
}
l=t.length();
int p=0,mx=0;
for(int i=1;i<l;i++){
if(mx>i) a[i]=min(mx-i,a[2*p-i]);
else a[i]=1;
while(i-a[i]>=1&&i+a[i]<l&&t[i-a[i]]==t[i+a[i]]) a[i]++;
if(i+a[i]>mx){
mx=i+a[i];
p=i;
}
ll[i+a[i]-1]=max(a[i]-1,ll[i+a[i]-1]);
rr[i-a[i]+1]=max(a[i]-1,rr[i-a[i]+1]);
}
for(int i=l-2;i>=2;i-=2) ll[i]=max(ll[i+2]-2,ll[i]);
for(int i=2;i<l;i+=2) rr[i]=max(rr[i-2]-2,rr[i]);
for(int i=2;i<=l;i+=2) if(ll[i]&&rr[i]) ans=max(ll[i]+rr[i],ans);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL),cout.tie(NULL);
cin>>s;
n=s.length();
manacher();
cout<<ans;
return 0;
}//P4555
回复
共 16 条回复,欢迎继续交流。
正在加载回复...