TLE 58分求调
查看原帖
TLE 58分求调
408557
Xuan_qwq楼主2024/12/13 19:28

rt,提交记录

把样例下载下来本机测 1s 不到,不知道为什么交上去就 T 了。

#include <bits/stdc++.h>
using namespace std;
string a,s;
int n,ans,p[200005];
int l[200005],r[200005];
int main(){
//	freopen("P4555_3.in","r",stdin);
//	freopen("P")
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>a;n=a.size();
	a='*'+a;s="~|";
	int cnt=1;
	for(int i=1;i<=n;i++)s=s+a[i]+'|';
	n=n*2+2;s=s+'#';
	int j=0,mid;
	for(int i=1;i<=n;i++){
		if(i<j)p[i]=min(p[mid*2-i],j-i);
		else p[i]=1;
		while(s[i+p[i]]==s[i-p[i]])p[i]++;
		if(p[i]+i>j)j=p[i]+i,mid=i;
		r[i+p[i]-1]=max(r[i+p[i]-1],p[i]-1);
		l[i-p[i]+1]=max(l[i-p[i]+1],p[i]-1);
	}
	for(int i=n;i>=1;i-=2)r[i]=max(r[i],r[i+2]-2);
	for(int i=1;i<=n;i+=2)l[i]=max(l[i],l[i-2]-2);
	for(int i=1;i<=n;i+=2)if(r[i]&&l[i])ans=max(ans,l[i]+r[i]);
	cout<<ans<<endl;
	return 0;
}
2024/12/13 19:28
加载中...