46| FBI树

一、核心思路

用前缀和快速判断区间类型,递归不断二分,先分左右,最后输出自己,就是 FBI 树。

1.前缀和预处理(快速查区间)

  • f[i] 存:前 i 个字符里 1 的个数
  • 想知道 [l, r] 是什么类型:
    • 和为 0 → B
    • 和 = 长度 → I
    • 其他 → F

2. 递归分治(核心)

把当前字符串 分成左右两半

  • 左:l ~ mid
  • 右:mid+1 ~ r

一直分,分到不能再分(只剩一个字符) 为止。

3. 叶子节点直接输出

分到最小单位

  • 输出 B/I
  • 立刻返回,不再继续分割
  • 防止无限递归、越界

二、代码实现

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 11;
int f[1 << N];
int n;
void dfs(int l, int r) 
{
	if(l > r) return; 
	char ret;  // 判断字串类型 
	if (f[r] - f[l-1] == (r - l + 1)) ret = 'I';
	else if (f[r] - f[l-1] == 0) ret = 'B';
	else ret = 'F';
	// 递归构建 
	if(l == r)  // 叶子节点直接输出 
	{
		cout << ret;
		return; 
	 } 
	int mid = (l + r) >> 1;
	dfs(l, mid); // 左子树 
	dfs(mid + 1, r); // 右子树 
	cout << ret; // 根节点 
}
signed main()
{
	cin >> n;
	n = (1 << n);
	for (int i = 1; i <= n; i++)
	{
		int t = 0;
		char ch; cin >> ch;
		if(ch == '1') t = 1;
		f[i] = f[i-1] + t;
	}
	dfs(1,n);
	
	return 0;
 } 
相关推荐
郝学胜-神的一滴25 分钟前
完全二叉树与堆底层原理深度剖析 | 手写C++大顶堆实现
java·开发语言·数据结构·c++·python·算法
WangN227 分钟前
【通识】宇树G1_29DOF速度跟踪训练—逐章学习手册
人工智能·python·学习·机器人·具身智能
青山木27 分钟前
Hot 100 --- 缺失的第一个正数
算法·leetcode·哈希算法
农民小飞侠28 分钟前
[leetcode] 165. Compare Version Numbers
java·算法·leetcode
装不满的克莱因瓶39 分钟前
掌握语义分割经典模型 FCN——从像素分类到端到端分割的奠基之作
人工智能·python·深度学习·算法·机器学习·分类·数据挖掘
لا معنى له40 分钟前
NeoVerse: Enhancing 4D World Model with in-the-wild Monocular Videos
人工智能·笔记·机器学习·语言模型
黄毛火烧雪下42 分钟前
Java 基础笔记:文件、递归与字符编码
java·开发语言·笔记
学计算机的计算基43 分钟前
链表算法上篇:LeetCode 206/234/141/142/160/21 题解与易错点
java·笔记·算法·链表
大白话_NOI1 小时前
【洛谷 P2678】 [NOIP2015 提高组] 跳石头 超详细题解
c++·算法
xwz小王子1 小时前
ICRA 2026深度观察:全栈闭环成标配,中国具身智能势力显著崛起
大数据·人工智能·算法