首页 > 其他分享 >洛谷P1087 FBI树

洛谷P1087 FBI树

时间:2024-05-27 17:47:09浏览次数:23  
标签:cnt 洛谷 start int self current P1087 end FBI

洛谷P1087

递归建立树,根据当前树的类型,选择“F”“B”“I”

void build(int depth, int start, int end, int root){
    if (depth >= n+1) return;
    int current = root;
    int flag = check(start, end);
    if (flag == 0) t[current].self = 'B';
    else if (flag == 1) t[current].self = 'I';
    else t[current].self = 'F';

    t[current].left = ++cnt;
    build(depth + 1, start, (start + end) / 2, cnt);

    t[current].right = ++cnt;
    build(depth + 1, (start + end) / 2 + 1, end, cnt);
}
t[current].left = ++cnt;
build(depth + 1, (start + end) / 2 + 1, end, cnt);
t[current].right = ++cnt;
build(depth + 1, start, (start + end) / 2, cnt);

这一部分保证了子节点不会被重复指向
递归建立因为每一次建立,cnt都会加1,所以不会重复指向

AC代码

#include<bits/stdc++.h>
using namespace std;
int n, cnt = 1;
vector<int> num;

struct node{
    char self;
    int left, right;
    node(): left(0), right(0), self('*'){}
};
vector<node> t;

int check (int start, int end) {
    int flag0 = 0, flag1 = 0;
    for (int i = start; i <= end; i++) {
        if (num[i] == 0) flag0 = 1;
        if (num[i] == 1) flag1 = 1;
    }
    if (flag0 == 0 && flag1 == 1) return 1;
    if (flag0 == 1 && flag1 == 0) return 0;
    return 2;
}

void build(int depth, int start, int end, int root){
    if (depth >= n+1) return;
    int current = root;
    int flag = check(start, end);
    if (flag == 0) t[current].self = 'B';
    else if (flag == 1) t[current].self = 'I';
    else t[current].self = 'F';

    t[current].left = ++cnt;
    build(depth + 1, start, (start + end) / 2, cnt);

    t[current].right = ++cnt;
    build(depth + 1, (start + end) / 2 + 1, end, cnt);
}

void print(int root) {
    if (t[root].self == '*') return;
    print(t[root].left);
    print(t[root].right);
    cout << t[root].self;
}

int main() {
    cin >> n;
    num.resize((1<<(n+1))+100);
    t.resize((1<<(n+2))+100);
    char ch;
    for (int i = 1; i <= (1<<n); i++) {
        cin >> ch;
        num[i] = ch-'0';
    }
    build(0, 1, (1<<n), 1);
    print(1);
}

标签:cnt,洛谷,start,int,self,current,P1087,end,FBI
From: https://www.cnblogs.com/rjxq/p/18216090

相关文章

  • 中序后序到先序 洛谷P1030
    洛谷P1030输入中序先序序列,输出后序l1-l2为当前中序遍历序列l3-l4为当前后序遍历序列#include<bits/stdc++.h>usingnamespacestd;stringa,b;structnode{charself;intleft,right;}t[200];voidbuild(intl1,intl2,intl3,intl4){for(int......
  • 洛谷P1996约瑟夫问题
    题目描述 P996约瑟夫问题n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 11 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰 n−1 ......
  • Smart - Luogu —— 智能的洛谷
    目录安装Stylus谷歌Edge安装Smart-Luogu使用尾声安装Styluslink点击推荐下载,获取crx文件谷歌先点击右上角三个点,再点击扩展程序,然后点击管理扩展程序,进入管理扩展界面,把开发者模式选上,把crx文件拖入即可Edge先点击右上角三个点,再点击扩展,然后点击管理扩展程序,进入......
  • 二叉树搜索树 洛谷P5076
    洛谷P1827#include<bits/stdc++.h>usingnamespacestd;intn,root,cnt,opt,x;structnode{intvalue,left,right,size,num;node(intl,intr,ints,intv):left(l),right(r),size(s),value(v),num(1){}node(){}}t[10010];voidu......
  • 洛谷[普及]:P1149 [NOIP2008 提高组] 火柴棒等式
    [NOIP2008提高组]火柴棒等式感谢题目提供者CCF_NOI题目描述给你n 根火柴棍,你可以拼出多少个形如A+B=C 的等式?等式中的A、B、C 是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字 的拼法如图所示:注意:1.加号与等号各自需要两根火柴棍;2.如果,则......
  • CSP历年复赛题-P1087 [NOIP2004 普及组] FBI 树
    原题链接:https://www.luogu.com.cn/problem/P1087题意解读:字符串作为根,左边一半作为左子树,右边一半作为右子树,递归构造数,并按FBI规则输出后续遍历结果。解题思路:按照题意,通过dfs来构造树,对于字符串str,提取左边一半递归构造左子树,提取右边一半递归构造右子树,前提是字符串长度>1......
  • 深度优先搜索 洛谷P1605迷宫
    深度优先搜索洛谷P1605迷宫题目描述给定一个$N\timesM$方格的迷宫,迷宫里有$T$处障碍,障碍处不可通过。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方......
  • 广度优先搜索 洛谷P2895Meteor Shower S
    广度优先搜索洛谷P2895[USACO08FEB]MeteorShowerS题面翻译题目描述贝茜听说一场特别的流星雨即将到来:这些流星会撞向地球,并摧毁它们所撞击的任何东西。她为自己的安全感到焦虑,发誓要找到一个安全的地方(一个永远不会被流星摧毁的地方)。如果将牧场放入一个直角坐标系中,贝茜......
  • 二分答案 洛谷P3853路标设置
    这个题思路和洛谷P2440有点像,建议先看P2440这个题,较简单。[TJOI2007]路标设置题目背景B市和T市之间有一条长长的高速公路,这条公路的某些地方设有路标,但是大家都感觉路标设得太少了,相邻两个路标之间往往隔着相当长的一段距离。为了便于研究这个问题,我们把公路上相邻路标的最......
  • 广度优先搜索 洛谷P1443马的遍历(bfs超时问题)
    广度优先搜索洛谷P1443这里先介绍一下广度优先搜索:广度优先搜索就是先将第一步可能的步骤全部记录,遍历过后,再将由第一步到达的第二步全部记录并遍历,直到最后全部遍历。而此题要求我们求得最少步数,广度优先就能够达到最少步数的要求,因为广度优先是先通过搜索所有可能的第n步才......