重走普及路 樹 FBI樹

2021-07-09 05:23:27 字數 1856 閱讀 2043

我們可以把由「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樹,並輸出它的後序遍歷序列。輸入格式:

第一行是乙個整數n(0 <= n <= 10),第二行是乙個長度為2^n的「01」串。

輸出格式:

包括一行,這一行只包含乙個字串,即fbi樹的後序遍歷序列。

輸入樣例#1:

3

10001011

輸出樣例#1:

ibfbbbfibfiiiff
對於40%的資料,n <= 2;

對於全部的資料,n <= 10。

noip2004普及組第3題

事先說明 我的方法很愚蠢 只是為了接觸樹的一些演算法

那麼。。。樹這種神奇的東西,題目中的樹是滿二叉樹。。。所以可用三個陣列表示:

tree[i] 第i個節點的字元('f','b','i')

treel[i] 第i個節點的左子樹

treer[i] 第i個節點的右子樹

當然要自下而上構建樹更好。。。不解釋 然後後序遍歷一遍即可

——2015.12.29

var n,t,i,t1:longint;

s:ansistring;

tree:array[0..3000] of char;

treel,treer:array[0..2049] of integer;

procedure ok(t:longint); //後序遍歷

begin

if t=0 then exit;

ok(treel[t]); //後序遍歷 左 右 中

ok(treer[t]);

write(tree[t]);

end;

begin

readln(n);

readln(s);

if n=0 then begin //特殊情況特殊考慮~

if s='1' then writeln('i')

else writeln('b');

close(input);

close(output);

halt;

end;

t:=1;

for i:=1 to n do t:=t*2;

for i:=t to 2*t-1 do begin //把樹的「葉子」(即底層)構建好

inc(t1);

if s[t1]='0' then tree[i]:='b'

else tree[i]:='i';

end;

for i:=t-1 downto 1 do begin //(自下而上構建)

treel[i]:=2*i;//不解釋

treer[i]:=2*i+1; //不解釋

if (tree[2*i]='b')and(tree[2*i+1]='b') then tree[i]:='b'

else if (tree[2*i]='i')and(tree[2*i+1]='i') then tree[i]:='i'

else tree[i]:='f'; //判斷當前節點的字元

end;

ok(1);

end.

重走普及路 貪心 合併果子

在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n 1次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和。...

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.接下來程式設計實...

重走普及路 分治 經典演算法 快速冪

輸入b,p,k的值,求b p mod k的值。其中b,p,k k為長整型數。輸入格式 三個整數b,p,k.輸出格式 輸出 b p mod k s s為運算結果 輸入樣例 1 2 10 9輸出樣例 1 2 10 mod 9 7分治,即 將大問題拆分為小問題,分而治之,各個擊破,然後在合併回來。firs...