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
- 若左右子树全部返回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树 题解的主要内容,如果未能解决你的问题,请参考以下文章