欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

FBI树(信息学奥赛一本通-T1365)

发布时间:2025/3/17 51 豆豆
生活随笔 收集整理的这篇文章主要介绍了 FBI树(信息学奥赛一本通-T1365) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

【题目描述】

我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。

FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:

T的根结点为R,其类型与串S的类型相同;

若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。

现在给定一个长度为2N的“01”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历序列。

【输入】

第一行是一个整数N(0 ≤ N ≤ 10),第二行是一个长度为2N的“01”串。

【输出】

一行,这一行只包含一个字符串,即FBI树的后序遍历序列。

【输入样例】

3
10001011

【输出样例】

IBFBBBFIBFIIIFF

【提示】

【源程序】

#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<vector> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 3001 #define MOD 123 #define E 1e-6 using namespace std; int n; char a[N],b[N]; void build(char *s,int n) {int k=0;for(int i=(1<<n);i<=(1<<(n+1))-1;i++){if(a[k++]=='0')b[i]='B';elseb[i]='I';}for(int i=n-1;i>=0;i--)for(int j=(1<<i);j<=(1<<(i+1))-1;j++){if(b[2*j]=='B'&&b[2*j+1]=='B')b[j]='B';else if(b[2*j]=='I'&&b[2*j+1]=='I')b[j]='I';elseb[j]='F';} } void visit(int node) {if(node>( 1<<(n+1))-1 )return;visit(node*2);visit(node*2+1);cout<<b[node]; } int main() {cin>>n;cin>>a;build(a,n);visit(1);return 0; }

 

 

 

总结

以上是生活随笔为你收集整理的FBI树(信息学奥赛一本通-T1365)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。