P1087 [NOIP 2004 普及组] FBI 树
📅 2026/7/10 15:56:17
👁️ 次浏览
记录143#includebits/stdc.h using namespace std; // 使用标准命名空间std string s; // 存储01字符串 // 递归函数处理字符串区间 [l, r] void dfs(int l,int r) { // 1. 判断当前区间的类型 bool has0false,has1false; for(int il;ir;i) { if(s[i]0) has0true; else has1true; } char type; // 当前节点的类型 if(has0has1) typeF; // 既有0又有1 else if(has0) typeB; // 只有0 else typeI; // 只有1 // 2. 如果区间长度大于1继续递归切分左右子树 if(lr) { int mid(lr)/2; dfs(l,mid); // 递归左子树 dfs(mid1,r); // 递归右子树 } // 3. 后序遍历最后输出当前节点的类型 couttype; } int main() { // 主函数入口 ios::sync_with_stdio(false); // 关闭同步加速IO cin.tie(0); int n; cinns; // 读入N和01串 // 启动递归初始区间是整个字符串 [0, s.size()-1] dfs(0,s.size()-1); cout\n; // 输出换行 return 0; }题目传送门https://www.luogu.com.cn/problem/P1087前言我是一名专注信奥赛CSP-J/S、NOIP的教练。如果你觉得这篇题解对你有帮助欢迎点击关注我的CSDN账号我会持续更新高质量算法解析。我深知算法思维的构建远比单纯通过题目更重要本系列题解不局限于AC代码的堆砌而是致力于拆解题目背后的逻辑链条与核心知识点备赛路上若遇瓶颈欢迎随时评论或私信我将甄选典型疑难问题通过视频讲解或撰写专项文章的形式为你提供深度答疑。核心解题思路这道题是一道非常经典的递归分治与二叉树遍历问题。核心原理题目给出了 FBI 树的递归构造方法根节点的类型由当前字符串决定如果字符串长度大于 1则从中间一分为二分别构造左子树和右子树。这天然契合二叉树的结构。题目要求输出后序遍历序列即“左子树 - 右子树 - 根节点”的顺序。算法设计分治递归我们不需要真正地在内存中构建出树的结构即不需要定义节点类或结构体。只需要写一个递归函数传入当前处理的字符串区间[l, r]。在函数内部先判断当前区间对应的节点类型然后如果区间长度大于 1就递归处理左半区间和右半区间最后输出当前节点的类型。这种“先递归左右再输出自身”的操作恰好就是后序遍历。代码分块详细解释1. 头文件与全局变量定义#includebits/stdc.h using namespace std; // 使用标准命名空间std string s; // 存储01字符串详细分析题目中字符串的长度为 2N2N 当 N10N10 时字符串长度最多为 21010242101024 。使用string类型存储非常方便且可以像数组一样通过下标访问。将字符串定义为全局变量可以避免在递归函数中反复传递字符串提高运行效率。2. 核心逻辑分治递归函数dfs// 递归函数处理字符串区间 [l, r] void dfs(int l, int r) { // 1. 判断当前区间的类型 bool has0false, has1false; for(int il; ir; i) { if(s[i]0) has0true; else has1true; } char type; // 当前节点的类型 if(has0 has1) typeF; // 既有0又有1 else if(has0) typeB; // 只有0 else typeI; // 只有1 // 2. 如果区间长度大于1继续递归切分左右子树 if(l r) { int mid (lr)/2; dfs(l, mid); // 递归左子树 dfs(mid1, r); // 递归右子树 } // 3. 后序遍历最后输出当前节点的类型 cout type; }详细分析这是本题的灵魂所在完美体现了“分治”与“后序遍历”的结合。节点类型判定通过一个for循环遍历当前区间[l, r]内的所有字符用两个布尔变量has0和has1记录是否出现过 0 和 1。根据两者的组合情况确定当前节点是 F、B 还是 I。递归切分如果l r说明当前区间长度大于 1需要继续向下构造子树。计算中间位置mid (lr)/2然后分别对左半区间[l, mid]和右半区间[mid1, r]发起递归调用。后序输出注意代码的执行顺序是先调用dfs(l, mid)处理左子树再调用dfs(mid1, r)处理右子树最后才执行cout type输出根节点。这严格遵循了后序遍历“左右根”的规则保证了最终拼接出的字符串就是正确的后序遍历序列。3. 主函数输入处理与启动递归int main() { ios::sync_with_stdio(false); // 关闭同步加速IO cin.tie(0); int n; cin n s; // 读入N和01串 // 启动递归初始区间是整个字符串 [0, s.size()-1] dfs(0, s.size()-1); cout \n; // 输出换行 return 0; }详细分析主函数负责读取输入的 NN 和 01 串并启动递归。dfs(0, s.size()-1)表示最初我们要处理的是整个字符串左右边界分别是0和字符串长度-1。核心逻辑总结表代码模块核心变量/操作精炼作用解决的痛点节点类型判定has0与has1布尔标记遍历当前区间判断包含的字符种类准确确定当前递归层对应的节点是 F、B 还是 I递归切分int mid (lr)/2将当前区间从正中间一分为二完美契合 FBI 树“等长左右子串”的构造规则递归左子树dfs(l, mid)递归处理左半部分区间深入树的左侧分支遵循后序遍历“先左”的规则递归右子树dfs(mid1, r)递归处理右半部分区间深入树的右侧分支遵循后序遍历“后右”的规则根节点输出cout type在左右子树递归结束后输出当前类型遵循后序遍历“最后根”的规则直接拼接出最终答案递归终止if(l r)当区间长度为1时不再向下递归保证了递归在叶子节点处正确停止防止死循环
Apollo Save Tool:PS4存档管理终极指南,轻松搞定游戏进度备份与修改 【免费下载链接】apollo-ps4 Apollo Save Tool (PS4) 项目地址: https://gitcode.com/gh_mirrors/ap/apollo-ps4
还在为PS4游戏进度丢失而烦恼吗?每次重新开始都让你…
📅 2026/7/10 15:55:17
如果你正在寻找一种高效处理直播视频剪辑的方法,特别是针对AI技术演讲这类专业内容,那么AIE(AI Engine)技术可能是你需要的解决方案。传统的视频剪辑流程往往耗时耗力,而结合AI技术的自动化剪辑方案正在改变这一现状。…
📅 2026/7/10 15:55:17
10分钟上手DefaultEcs:从零构建你的第一个实体组件系统 【免费下载链接】DefaultEcs Entity Component System framework aiming for syntax and usage simplicity with maximum performance for game development. 项目地址: https://gitcode.com/gh_mirrors/de/…
📅 2026/7/10 15:55:17
Multi-Agent Medical Assistant图像分析模块详解:从X光到皮肤病变的智能诊断 【免费下载链接】Multi-Agent-Medical-Assistant ⚕️GenAI powered multi-agentic medical diagnostics and healthcare research assistance chatbot. 🏥 Designed for heal…
📅 2026/7/10 17:01:10
1. 高压隔离技术概述 在工业控制和电力电子系统中,高压隔离是确保人员和设备安全的关键技术。ISOM8710作为一款高性能数字隔离器,与STM32F756ZG微控制器的组合,为高压应用提供了可靠的隔离解决方案。 高压隔离的核心需求包括: 防…
📅 2026/7/10 17:01:10
如何使用next-compose-plugins?5分钟快速上手Next.js插件管理 【免费下载链接】next-compose-plugins 💡next-compose-plugins provides a cleaner API for enabling and configuring plugins for next.js 项目地址: https://gitcode.com/gh_mirrors/n…
📅 2026/7/10 17:01:10
GreenStash性能优化技巧:Kotlin协程与Flow在Android中的应用终极指南 【免费下载链接】GreenStash Simple FOSS android app to help you plan and manage your savings goals easily and establish the habit of saving money. 项目地址: https://gitcode.com/gh…
📅 2026/7/10 17:01:10
Lattice存储方案:容器持久化存储配置与最佳实践 【免费下载链接】lattice-release Lattice 项目地址: https://gitcode.com/gh_mirrors/la/lattice-release
Lattice作为容器编排平台,提供了强大的容器持久化存储解决方案,帮助用户在动…
📅 2026/7/10 17:01:10
深度技术解析:如何彻底移除Windows Defender安全组件——从注册表到系统服务的完整解决方案 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址:…
📅 2026/7/10 17:00:09
一、为什么接口自动化测试,适合用AI赋能?
大家可自行先思考一个问题:
AI赋能测试全流程,为什么优先推荐从接口自动化切入?
有三个典型原因:
接口输入结构化,AI最擅长"吃"
接口有OpenA…
📅 2026/7/10 0:00:53
终极原神FPS解锁器完整指南:轻松突破60帧限制 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock
原神FPS解锁器是一款专为《原神》玩家设计的开源工具,通过先进的Wri…
📅 2026/7/10 0:00:53
YesPlayMusic:如何用高颜值播放器重塑你的网易云音乐体验?🎵 【免费下载链接】YesPlayMusic 高颜值的第三方网易云播放器,支持 Windows / macOS / Linux :electron: 项目地址: https://gitcode.com/gh_mirrors/ye/YesPlayMusic…
📅 2026/7/10 0:00:53
1. 项目背景与核心需求 在嵌入式系统开发中,快速精确的数据检索是一个常见但极具挑战性的需求。特别是在工业控制、医疗设备和物联网终端等场景下,系统往往需要在毫秒级时间内完成关键参数的读取和写入操作。传统基于Flash存储的方案存在擦写次数有限、操…
📅 2026/7/9 15:10:35
1. 工业电流环信号传输的基础认知在工业自动化领域,4-20mA电流环传输技术已经持续服役超过半个世纪。这种看似简单的信号传输方式之所以能经久不衰,核心在于其独特的抗干扰能力——电流信号在长距离传输时几乎不受线路电阻和电压波动的影响。我曾在化工厂…
📅 2026/7/9 14:14:01
最近在项目里尝试用 YOLO 做目标检测,从环境搭建到模型训练,再到推理部署,整个过程踩了不少坑。网上的资料虽然多,但要么版本老旧,要么步骤零散不成体系,对于刚入门的新手来说,很容易卡在某个环…
📅 2026/7/9 15:10:36
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/9 15:10:36
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/9 15:10:36
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/9 15:10:36