社区讨论

求条,悬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 条回复,欢迎继续交流。

正在加载回复...