灵异事件求条
查看原帖
灵异事件求条
828116
gala_xk楼主2024/7/12 16:49
#include <bits/stdc++.h>
#define int long long
#define min(x,y) (x<y?x:y)
#define max(x,y) (x>y?x:y)
using namespace std;
int n,ans=1145141919,ls[100005],rs[100005],sz[100005],f[100005],bo;
string s;
void dfs(int x,int fa){
	sz[x]++;
	if(s[x]=='1'||s[x]=='3'){
		ls[x]=x+sz[x];
		dfs(ls[x],x);
		sz[x]+=sz[ls[x]];
	}
	if(s[x]=='2'||s[x]=='3'){
		rs[x]=x+sz[x];
		dfs(rs[x],x);
		sz[x]+=sz[rs[x]];
	}
	f[x]=fa;
}
int pd(int a,int b){
	if(a==1&&b==1){
		return (sz[a]-1)*2;
	}
	if(a>n||b==0)return 1;
//	printf("%d %d ",a,b);
	int ret=0;
	int c=b,op[1005],h=0;
	while(c!=a){
	op[h++]=(ls[f[c]]==c);
	c=f[c];
	}
	int d=b;
	bo=0;int aa3=(sz[a]-sz[b])*2-h;
//	printf("%d\n",aa3);
	ret=aa3;
	while(h){
		if(op[h])d=ls[d];
		else d=rs[d];
		h--;
	}
	ret=max(ret,pd(b,d));
	return ret;
}
int aa2;
signed main(){
	cin>>s;
	n=s.size();
	s=" "+s;
	dfs(1,1);
//	for(int i=1;i<=n;i++)
//	printf("%d %d\n",i,sz[i]);
	for(int i=1;i<=n;i++){
		aa2=pd(1,i);
//		printf("%d\n",aa2);
		ans=min(ans,aa2);

	}
//	puts("");
	cout<<ans;
	return 0;
}

输入 1313000 ,输出4。

取消注释 printf("%d\n",aa2); 后,输入 1313000 ,输出3。

2024/7/12 16:49
加载中...