头像

欢迎来到我的博客

分享题解与总结

FBI树

这并非题解,这是疑问
(有一个样例没过,但是我又调不出错)

#include<bits/stdc++.h>
#define N 3000
using ll=long long;
using namespace std;
ll n,len,prefix[N];
char ans[N];
string s;

void dfs(ll l,ll r,ll idx)
{
	if(l>r) return ;
	ll rangel=r-l+1;
	ll zeroCnt=prefix[r]-prefix[l-1];
	ll mid=(l+r)/2;	
	if(l==r){
		ans[idx]=(zeroCnt==1)?'B':'I';
		return ;
	}
	
	if(0<zeroCnt&&zeroCnt<rangel){
		ans[idx]='F';
	} 
	else if(zeroCnt==0){
		ans[idx]='I';
	}
	else{
		ans[idx]='B';
	}
	dfs(l,mid,2*idx);
	dfs(mid+1,r,2*idx+1);
	return ;
}

void postOrder(ll root)
{
	if(ans[root]=='\0') return ;
	postOrder(2*root);
	postOrder(2*root+1);
	printf("%c",ans[root]);
}

int main()
{
	cin>>n>>s;
	len=s.size();
	for(ll i=1;i<=len;++i){//统计0~len-1中0的个数 
		if(s[i-1]=='0') prefix[i]=prefix[i-1]+1;
		else prefix[i]=prefix[i-1];
	}
	//此后操作不涉及原字符串 
	dfs(1,len,1);
	postOrder(1);
	return 0;
}
posted @ 2026-03-24 22:06  king_steph1209  阅读(12)  评论(0)    收藏  举报