NOIP2004T3FBI樹解題報告

2021-08-08 07:59:05 字數 1172 閱讀 3488

原題見洛谷(

我們可以把由「0」和「1」組成的字串分為三類:全「0」串稱為b串,全「1」串稱為i串,既含「0」又含「1」的串則稱為f串。

fbi樹是一種二叉樹,它的結點型別也包括f結點,b結點和i結點三種。由乙個長度為2^n的「01」串s可以構造出一棵fbi樹t,遞迴的構造方法如下:

1) t的根結點為r,其型別與串s的型別相同;

2) 若串s的長度大於1,將串s從中間分開,分為等長的左右子串s1和s2;由左子串s1構造r的左子樹t1,由右子串s2構造r的右子樹t2。

現在給定乙個長度為2^n的「01」串,請用上述構造方法構造出一棵fbi樹,並輸出它的後序遍歷序列。

首先我們考慮要進行後序遍歷,也就是說先遍歷左子樹,再遍歷右子樹,再遍歷父親。

所以我們再分治遞迴的過程中可以選擇 (l,l+(r-l)/2)和(1+l+(r-l)/2,r)兩種情況。

第一種是左子樹,第二種是右子樹。

遞迴到只剩下乙個的時候也就是l==r的時候到達邊界值。

我們就可以結束遞迴改為輸出結果。

用乙個tmp表示有幾個0

用乙個tmp1表示有幾個1

那我們可以知道

當tmp=0時,有0個0,表示這個子串全是1,輸出i

反之,當tmp1=0的時候,有0個1,表示這個子串全是0,輸出b

當tmp!=0並且tmp1!=0的時候子串既有0又有1,輸出f

**如下:

#include

#include

#include

#include

using

namespace

std;

const

int maxn=10000;

int n,a1[maxn<<1],l;

char a[maxn<<1];

void work(int l,int r)

int cnt=0;

int cnt1=0;

for(int i=l;i<=r;i++)

else

}if(!cnt)

else

if(!cnt1)

else

}int main()

work(1,l);

return

0;

}

NOIP2004普及組第3題 FBI樹

1106 noip2004普及組第3題 fbi樹 時間限制 1 sec 記憶體限制 128 mb 提交 10 解決 9 提交 狀態 討論版 命題人 外部匯入 題目描述 我們可以把由 0 和 1 組成的字串分為三類 全 0 串稱為b串,全 1 串稱為i串,既含 0 又含 1 的串則稱為f串。fbi樹是...

NOIP 2004 普及組 複賽 FBI樹

noip 2004 普及組 複賽 fbi樹 1.閱讀題目,還有些不知所云。2.對樣例進行手動模擬,弄明白題意了。fbi樹如下圖所示 ff f f b f i i b b b i b i i 1 t的根結點為r,其型別與串s的型別相同 此句是核心中的核心,也即f b i三種根節點。3.接下來程式設計實...

洛谷 NOIP2004 FBI樹 遞迴

時間限制 1.00s記憶體限制 125.00mb 我們可以把由 0 00 和 1 11 組成的字串分為三類 全 0 00 串稱為b bb串,全 1 11 串稱為i ii串,既含 0 00 又含 1 11 的串則稱為f ff串。f bi fbifb i樹是一種二叉樹,它的結點型別也包括f ff結點,b...