FBI樹 題解
阿新 • • 發佈:2019-02-05
amp tar tro char 什麽 spa .org data- main
洛谷題面
分析:
遞歸枚舉當前01串,返回值分三種:
- 返回1,表示當前01串為I串,即全部為1
- 返回0,表示當前01串為B串,即全部為0
- 返回3,表示當前01串為F串,即全部為3
於是你就問了,為什麽F串要返回3而不返回-1或2呢
我們先把遞歸的格式搞清楚,每次遞歸的是這個01串的左子樹與右子樹
左子樹與右子樹有以下幾種返回值:
左 0 1 3
右 0 1 3
- 若左右子樹全部返回0,返回值為0時,當前串為B串
- 若左右子樹全部返回1,返回值為2時,當前串為I串
- 而當前串為F串有許多情況:0+3,1+3,3+3,0+1
你會發現以上值有一個共同特點:不等於0或2
這就是為什麽F串返回3
然後就沒什麽了,在遞歸過程中按左-右-根
的順序即可
代碼如下
#include<cstring> #include<iostream> using namespace std; char s[(1<<10)+10]; int work(int l,int r) { if(l==r) { if(s[l]==‘0‘) cout<<"B"; else cout<<"I"; return s[l]==‘1‘; } int sl,sr,m=(l+r)/2; sl=work(l,m); sr=work(m+1,r); if(sl+sr==0) { cout<<"B"; return 0; } else if(sl+sr==2) { cout<<"I"; return 1; } else { cout<<"F"; return 3; } } int main() { cin>>s>>s; work(0,strlen(s)-1); return 0; }
FBI樹 題解