站外题求助!!
查看原帖
站外题求助!!
1059234
FamousKillerconan楼主2025/7/19 17:10

Hdu的Hotaru's problem

#include<bits/stdc++.h>
//#define int long long
#define PII pair<int,int>
#define endl "\n"
using namespace std;
const int N=2e6+5;
const int INF=0x3f3f3f3f;
const double EPS=1e-6;
const int MOD=19930726;
int n,d[N],t[N],ans,s[N],b[N],m;
void solve(){
	cin>>m;
	n=0;
	ans=0;
	for(int i=1;i<=m;i++)cin>>b[i];
	for(int i=1;i<=m;i++){
		s[++n]=-1;
		d[n]=0;
		s[++n]=b[i];
		d[n]=0;
	}
	s[++n]=-1;
	int l=0,r=-1;
	for(int i=1;i<=n;i++){
		int j=l+r-i;
		if(i>r){
			while(i-d[i]>=1&&i+d[i]<=n&&s[i-d[i]]==s[i+d[i]])d[i]++;
			l=i-d[i]+1,r=i+d[i]-1;
		}else if(j-l>=d[j])d[i]=d[j];
		else{
			d[i]=j-l+1;
			while(i-d[i]>=1&&i+d[i]<=n&&s[i-d[i]]==s[i+d[i]])d[i]++;
			l=i-d[i]+1,r=i+d[i]-1;
		}
	}
	for(int i=1;i<=n;i++){
		if(d[i]<=ans)continue;
		int j=i+d[i]-1;
		if(j>n)continue;
		if(d[i]<=d[j])ans=max(ans,d[i]-1);
		else{
			int tmp=d[i];
			while(tmp){
				tmp--;
				int j=i+tmp-1;
				if(d[j]>=tmp){
					ans=max(ans,tmp);
					break;
				}
			}
		}
	}
	cout<<ans/2*3<<endl;
} 
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int T=1;
	cin>>T;
	for(int i=1;i<=T;i++){
		cout<<"Case #"<<i<<": ";
		solve();
	}
	return 0;
}
2025/7/19 17:10
加载中...