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;
}

浙公网安备 33010602011771号