洛谷 1087——FBI树
題目描述
我們可以把由“0”和“1”組成的字符串分為三類:全“0”串稱為B串,全“1”串稱為I串,既含“0”又含“1”的串則稱為F串。
FBI樹是一種二叉樹,它的結(jié)點(diǎn)類型也包括F結(jié)點(diǎn),B結(jié)點(diǎn)和I結(jié)點(diǎn)三種。由一個(gè)長度為2^N的“01”串S可以構(gòu)造出一棵FBI樹T,遞歸的構(gòu)造方法如下:
1) T的根結(jié)點(diǎn)為R,其類型與串S的類型相同;
2) 若串S的長度大于1,將串S從中間分開,分為等長的左右子串S1和S2;由左子串S1構(gòu)造R的左子樹T1,由右子串S2構(gòu)造R的右子樹T2。
現(xiàn)在給定一個(gè)長度為2^N的“01”串,請用上述構(gòu)造方法構(gòu)造出一棵FBI樹,并輸出它的后序遍歷序列。
輸入輸出格式
輸入格式:
第一行是一個(gè)整數(shù)N(0 <= N <= 10),第二行是一個(gè)長度為2^N的“01”串。
輸出格式:
包括一行,這一行只包含一個(gè)字符串,即FBI樹的后序遍歷序列。
輸入輸出樣例
輸入樣例#1:
3
10001011
輸出樣例#1:
IBFBBBFIBFIIIFF
說明
對于40%的數(shù)據(jù),N <= 2;
對于全部的數(shù)據(jù),N <= 10
其實(shí),題目大意就是二分出一個(gè)區(qū)間,找到這個(gè)區(qū)間所代表的字母(“F”,”B”,”I”)
從題意中中,我們以得知此題用二分答案
遞歸二分后,在一個(gè)循環(huán)統(tǒng)計(jì)“0”,“1”的個(gè)數(shù),最后判斷一下就行了
代碼如下:
#include <cstdio> #include <cstring> using namespace std; int const Maxn=10000; int n,a1[Maxn],l; char a[Maxn]; void work(int l,int r) {if(l<r){work(l,l+(r-l)/2);work(1+l+(r-l)/2,r);}int tmp,tmp1;tmp=tmp1=0;for(int i=l;i<=r;i++) if(a1[i])tmp1++; else tmp++;if(!tmp) printf("I");else if(!tmp1) printf("B");else printf("F"); } int main() {scanf("%d",&n);scanf("%s",&a[1]);l=strlen(&a[1]);for(int i=1;i<=l;i++)a1[i]=a[i]-'0';work(1,l);return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/Comfortable/p/8412300.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的洛谷 1087——FBI树的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (二)用户相关操作
- 下一篇: 51Nod - 1183 编辑距离