洛谷 - [NOIP2004]FBI树(递归)

题目链接:https://www.luogu.org/problem/P1087
时间限制: 1.00s 内存限制: 125.00MB

题目描述

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

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

T T T的根结点为 R R R,其类型与串 S S S的类型相同;
若串 S S S的长度大于 1 1 1,将串 S S S从中间分开,分为等长的左右子串 S 1 S_1 S1 S 2 S_2 S2;由左子串 S 1 S_1 S1构造 R R R的左子树 T 1 T_1 T1,由右子串 S 2 S_2 S2构造 R R R的右子树 T 2 T_2 T2
现在给定一个长度为 2 N 2^N 2N的“ 01 01 01”串,请用上述构造方法构造出一棵 F B I FBI FBI树,并输出它的后序遍历序列。

输入格式

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

输出格式

一个字符串,即 F B I FBI FBI树的后序遍历序列。

输入输出样例

输入 #1

3
10001011

输出 #1

IBFBBBFIBFIIIFF

说明/提示

对于40%的数据, N ≤ 2 N \le 2 N2
对于全部的数据, N ≤ 10 N \le 10 N10

解题思路

题意: 给你一个01串,让你构造一个FBI树,并输出它的后序遍历。
思路: 按题意模拟,后序遍历:先左儿子,后右儿子,最后根。判断根的时候看看左右孩子是否全为1,全为0,还是有1又有0,根据这来判断是I, B还是F。

Accepted Code:

/* 
 * @Author: lzyws739307453 
 * @Language: C++ 
 */
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
char str[MAXN];
void FBI(int l, int r) {
    if (l > r)
        return ;
    int cnt = 0, p = l;
    if (l < r) {
        int mid = l + (r - l >> 1);
        FBI(l, mid);
        FBI(mid + 1, r);
    }
    while (p <= r)
        cnt += str[p++] - '0';
    if (cnt && cnt < r - l + 1)
        printf("F");
    else if (cnt)
        printf("I");
    else printf("B");
}
int main() {
    int n;
    scanf("%d%s", &n, str);
    FBI(0, (1 << n) - 1);
    printf("\n");
    return 0;
}
相关推荐
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页