哈爾濱理工大學2016新生賽G題

2022-03-03 19:23:14 字數 2536 閱讀 1047

fbi tree的描述如下:

我們可以把由0和1組成的字串分為3類,全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樹,並輸出它的後續遍歷序列。

input

第一行為乙個正整數t,表示測試資料組數。

每組測試資料第一行為乙個整數n(0 <= n <= 10),第二行是乙個長度為2^n的01串。

output

輸出fbi樹的後續遍歷序列。

sample input

10001011 

sample output

ibfibfbbbfibfiiiff 

利用指標建立二叉樹,再進行後續遍歷。

直接構造一棵二叉樹即可,可以用最後一層節點來儲存2^n個值,則他們的父親結點的字元值就已經由左右兒子的b,i決定了,故不用儲存串,只需要記錄字元值。

1 #include 2 #include 3 #include 4 #include 5

using

namespace

std;

6char s1[2]="

0",s2[2]="1"

; 7char s[1200

]; 8

9struct

fbi10

; 14

15void showtree(fbi *head)//

後序遍歷樹16

2324

void maketree(fbi *node,char *p,int

len)25

38char q[520],*r=new

char

; 39 fbi *z=new

fbi;

40 strncpy(q,p,len/2

); 41 r=p;

42int i=len/2

; 43

while(i--)

44 r++; //

將p一分為二 q和r兩個字串

45if(strstr(q,s1)&&strstr(q,s2)) //

判斷左兒子的型別

46 z->s='f'

; 47

else

if(strstr(q,s1)&&!strstr(q,s2))

48 z->s='b'

; 49

else

if(!strstr(q,s1)&&strstr(q,s2))

50 z->s='i'

; 51 node->lchild=z;

52 fbi *c=new

fbi;

53if(strstr(r,s1)&&strstr(r,s2)) //

判斷右兒子的型別

54 c->s='f'

; 55

else

if(strstr(r,s1)&&!strstr(r,s2))

56 c->s='b'

; 57

else

if(!strstr(r,s1)&&strstr(r,s2))

58 c->s='i'

; 59 node->rchild=c;

60 maketree(z,q,len/2); //

遞迴構建

61 maketree(c,r,len/2

); 62

} 63

64int

main()65

81 fbi *head=new

fbi;

82char s1[2]="

0",s2[2]="1"

; 83

if(strstr(s,s1)&&strstr(s,s2))

84 head->s='f'

; 85

else

if(strstr(s,s1)&&!strstr(s,s2))

86 head->s='b'

; 87

else

if(!strstr(s,s1)&&strstr(s,s2))

88 head->s='i'

; 89 maketree(head,s,(int)pow(2.0,(double

)n));

90showtree(head);

91 printf("\n"

); 92

} 93

return0;

94 }

哈爾濱理工大學2016新生賽K題

小明這個人特別無聊,他喜歡把乙個字串以乙個奇怪的姿勢壓縮起來。他會把連續的字元表示成字元和數字的形式,而且他用的數字還都是一位的!比如下面這個例子 a12 表示的是 aaaa 也就是說壓縮後的字串裡的每個數字表示重複最後乙個出現的字元數字次,就好像上面的例子。現在給你一些被無聊的小明壓縮過的字串,你...

哈爾濱理工大學2016新生賽I題

這次我們要寫乙個簡單的行編輯器,當按下 時代表按下了一次退格符,當按下 時代表乙個退行符 使當前行的字元全部無效 例如,假設從終端接收了這樣的兩行字元 whil lr e s s outcha putchar s 則實際有效的是下列兩行 while s putchar s 請你編寫乙個程式,輸出實際...

哈爾濱理工大學2016新生賽D題

陳月亮從小就熱愛數學,這天老師講到任何乙個正整數n,我們可以很容易的找出n的所有因子,n1,n2,n3.nk,稱n一共有k個因子 包含1和n本身 求出k的值這個問題對於陳月亮來說實在是太簡單了,於是她想要求出n所有因子的因子個數 如n1可能包含n1個因子 包含1和n1本身 n2可能包含n2個因子,n...