【洛谷P1087】FBI樹
阿新 • • 發佈:2018-11-29
題目大意:後序遍歷
題解:建立二叉樹的碼風不知道怎麼突然跟線段樹一樣了...當然,這道題不建樹也是可以的。
程式碼如下
#include <bits/stdc++.h> using namespace std; const int maxn=1100; int n,len,sum[maxn];// cnt of 0 char s[maxn]; struct node{ #define ls t[k].lc #define rs t[k].rc int lc,rc; char val; }t[maxn<<1]; int tot=1; inline char get(int l,int r){ int tmp=sum[r]-sum[l-1]; return tmp==r-l+1?'B':tmp==0?'I':'F'; } void build(int k,int l,int r){ if(l==r){t[k].val=get(l,r);return;} int mid=l+r>>1; ls=++tot,t[ls].val=get(l,mid),build(ls,l,mid); rs=++tot,t[rs].val=get(mid+1,r),build(rs,mid+1,r); } void dfs(int k){ if(ls)dfs(ls); if(rs)dfs(rs); printf("%c",t[k].val); } void read_and_parse(){ scanf("%d%s",&n,s+1); len=1<<n; for(int i=1;i<=len;i++)sum[i]=s[i]=='0'?sum[i-1]+1:sum[i-1]; } void solve(){ t[1].val=get(1,len); build(1,1,len); dfs(1); puts(""); } int main(){ read_and_parse(); solve(); return 0; }