P1087的题解
好久没写题解了QwQ
这道题我的代码感觉很像线段树(?)
我们先把这道题拆成两个部分:建树、遍历
part.1 建树
我们可以每一次传入三个值:当前的结点和当前结点所对应的串的左右端点的下标
当然,我们还要专门写一个判断当前这个串的类型
具体的看注释
char FBI(int l,int r) //该串的左右端点
{
bool B=false; //判断该串0是否出现
bool I=false; //判断该串1是否出现
for(int i=l;i<=r;i++) //扫一遍
{
if(s[i]==0) B=true;
if(s[i]==1) I=true;
}
//返回
if(B&&I) return 'F';
if(B&&!I) return 'B';
if(!B&&I) return 'I';
}
void build(int p,int l,int r) //p:当前结点 l:左端点 r:右端点
{
tree[p]=FBI(l,r); //赋值当前结点所对应的的串的类型
if(l!=r) //如果不是该树的最后一层,那么继续构造
{
int mid=(l+r)/2; //求出分界线
build(p*2,l,mid); //构造左子树
build(p*2+1,mid+1,r); //构造右子树
}
}
part.2 遍历
遍历部分更简单了吧
就是分两种情况:
1.若该节点不在最后一层,那么先遍历左右子树,最后输出该节点
2.若该节点在最后一层,直接输出
如何判断该节点的位置呢?我还是用了左右端点,或者也可以直接用最后一层的范围去判断
这个蒟蒻很懒不想写
具体看注释叭
void LRD(int p,int l,int r) //p:当前结点 l:左端点 r:右端点
{
if(l==r) printf("%c",tree[p]); //如果是最后一层,直接输出
else //不在最后一层
{
int mid=(l+r)/2; //求出分界线
LRD(p*2,l,mid); //遍历左子树
LRD(p*2+1,mid+1,r); //遍历右子树
printf("%c",tree[p]); //输出
}
}
都到这里了还不会?
完整代码如下:
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
int n;
int s[3000];
char tree[3000];
string str;
int m(int p)
{
int a=1;
for(int i=1;i<=p;i++) a*=2;
return a;
}
char FBI(int l,int r) //该串的左右端点
{
bool B=false; //判断该串0是否出现
bool I=false; //判断该串1是否出现
for(int i=l;i<=r;i++) //扫一遍
{
if(s[i]==0) B=true;
if(s[i]==1) I=true;
}
//返回
if(B&&I) return 'F';
if(B&&!I) return 'B';
if(!B&&I) return 'I';
}
void build(int p,int l,int r) //p:当前结点 l:左端点 r:右端点
{
tree[p]=FBI(l,r); //赋值当前结点所对应的的串的类型
if(l!=r) //如果不是该树的最后一层,那么继续构造
{
int mid=(l+r)/2; //求出分界线
build(p*2,l,mid); //构造左子树
build(p*2+1,mid+1,r); //构造右子树
}
}
void LRD(int p,int l,int r) //p:当前结点 l:左端点 r:右端点
{
if(l==r) printf("%c",tree[p]); //如果是最后一层,直接输出
else //不在最后一层
{
int mid=(l+r)/2; //求出分界线
LRD(p*2,l,mid); //遍历左子树
LRD(p*2+1,mid+1,r); //遍历右子树
printf("%c",tree[p]); //输出
}
}
int main()
{
cin>>n>>str; //输入
//转成数字方便操作
for(int i=0,j=1;i<str.size();i++,j++) s[j]=str[i]-'0';
build(1,1,m(n)); //建树
LRD(1,1,m(n)); //遍历
return 0;
}
码风可能不好,见谅!
求赞
thanks for reading
从某位大佬学来的
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤