FBI树 题解

Posted shengzhe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FBI树 题解相关的知识,希望对你有一定的参考价值。

洛谷题面

分析:

递归枚举当前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树 题解的主要内容,如果未能解决你的问题,请参考以下文章

P1087 FBI树

FBI树(fbi)

Luogu P1087 FBI树

noip普及组2004 FBI树

FBI树

[NOIP2004]FBI树