1. 程式人生 > >FBI樹 題解

FBI樹 題解

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

  • 00B
  • 12I
  • F0+31+33+30+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樹 題解