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;
 } 
相关推荐
疯狂成瘾者2 小时前
git学习目录
git·学习
小辉同志2 小时前
139. 单词拆分
算法·动态规划
oem1102 小时前
C++中的访问者模式变体
开发语言·c++·算法
jinanwuhuaguo2 小时前
AI工具终极解构:OpenClaw、Coze、Dify、FastGPT、n8n、LangChain、RagFlow、GPTBots.ai 的万言深度剖析
人工智能·学习·重构·新人首发·openclaw
苦瓜小生2 小时前
【黑马点评学习笔记 | 实战篇 】| 6-Redis消息队列
redis·笔记·后端
IronMurphy2 小时前
【算法二十七】230. 二叉搜索树中第 K 小的元素 199. 二叉树的右视图
算法·深度优先
暮冬-  Gentle°2 小时前
C++中的工厂方法模式
开发语言·c++·算法
沐硕2 小时前
《基于改进协同过滤与多目标优化的健康饮食推荐系统设计与实现》
java·python·算法·fastapi·多目标优化·饮食推荐·改进协同过滤
Z9fish2 小时前
sse哈工大C语言编程练习47
c语言·数据结构·算法