0分求助,悬关
查看原帖
0分求助,悬关
755911
Ethereal_KQ楼主2024/2/26 21:45
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int p[10000005],answer;
void add() {
	for(int i=0; i<s1.length(); i++)
		s2+='#',s2+=s1[i];
	s2+='#',s2+='$';
}
void manacher() {
	int r=0,mid=0;
	for(int i=0; i<s2.size(); i++) {
		if(i<r) p[i]=min(r-i,p[2*mid-i]);
		else p[i]=1;
		while((s2[i+p[i]]=='1'&&s2[i-p[i]]=='0')or(s2[i+p[i]]=='0'&&s2[i-p[i]]=='1')or(s2[i+p[i]]=='#' and s2[i-p[i]]=='#')){
			p[i]++;
		}
		if(i+p[i]>r)r=i+p[i],mid=i;
	}
}
int n;
signed main() {
	cin>>n>>s1;
	add();
	manacher();
	for(int i=0;i<s2.size();i++)cout<<s2[i]<<" ";
	/*
	cout<<"\n";
	for(int i=0;i<s2.size();i++)cout<<p[i]<<" ";
	cout<<"\n";
	*/
	for(int i=0; i<s2.size(); i++){
		if(s2[i]=='1'||s2[i]=='0'){
			cout<<p[i]/2-1<<" ";
			answer+=p[i]/2-1;
		}
		if(s2[i]=='#'){
	//		cout<<(p[i]-1)/2<<" ";
			answer+=(p[i]-1)/2;
		}
	}
	//cout<<"\n";
	cout<<answer-1;
	return 0;
}
2024/2/26 21:45
加载中...