首页 > 其他分享 >P1087 [NOIP2004 普及组] FBI 树

P1087 [NOIP2004 普及组] FBI 树

时间:2024-08-25 10:53:39浏览次数:15  
标签:NOIP2004 10 ty int tree P1087 push FBI data

大家好!下面为大家讲解我做了两年半的题目,在这里插入图片描述

[NOIP2004 普及组] FBI 树

题目描述

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

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

  1. T T T 的根结点为 R R R,其类型与串 S S S 的类型相同;
  2. 若串 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 串,请用上述构造方法构造出一棵 FBI 树,并输出它的后序遍历序列。

输入格式

第一行是一个整数 N ( 0 ≤ N ≤ 10 ) N(0 \le N \le 10) N(0≤N≤10),

第二行是一个长度为 2 N 2^N 2N 的 01 串。

输出格式

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

样例 #1

样例输入 #1

3
10001011

样例输出 #1

IBFBBBFIBFIIIFF

提示

对于 40 % 40\% 40% 的数据, N ≤ 2 N \le 2 N≤2;

对于全部的数据, N ≤ 10 N \le 10 N≤10。

noip2004普及组第3题


反正题目就是这么说的,一开始还没看懂,用人话来说就是把10001011,分成1000,1011,然后把1000,1011分成10,00,10,11,再然后就把10,00,10,11分成1,0,0,0,1,0,1,1.然后用树来表示就是这样:
在这里插入图片描述

实现这个的代码十分简单难,长这样:

tree[1].data=s;
	queue<xd> q;
	q.push((xd){1,s});
	while(1) {
		o=q.front();
		q.pop();
		if(o.f.size()==1) {
			break;
		}
		string e,w;
		for(int i=0;i<o.f.size()/2;i++) {
			e.push_back(o.f[i]);
		}
		q.push((xd){o.ty*2,e});
		tree[o.ty*2].data=e;
		for(int i=o.f.size()/2;i<o.f.size();i++) {
			w.push_back(o.f[i]);
		}
		q.push((xd){o.ty*2+1,w});
		tree[o.ty*2+1].data=w;
	}

这运用了一个数据结构——队列,用人话叫先进先出的数据结构

char pd(string h) {
	int ans=0,ans1=0;
	for(int i=0;i<h.size();i++) {
		if(h[i]=='1') ans++;
		if(h[i]=='0') ans1++;
		if(ans>0&&ans1>0) return 'F';
	}
	if(ans>0) return 'I';
	else return 'B';
}
void dfs(int x) {
	if(tree[x].data.size()==0) {
		return ;
	}
	dfs(x*2);
	dfs(x*2+1);
	cout<<pd(tree[x].data);
}

这运用了一个数据结构——树,加上一个判断条件,判断是F or B or I.

#include <bits/stdc++.h>
using namespace std;
#define int long long 
int n;
string s;
struct node {
	string data;
}tree[100000];
struct xd {
	int ty;
	string f;
}o;
char pd(string h) {
	int ans=0,ans1=0;
	for(int i=0;i<h.size();i++) {
		if(h[i]=='1') ans++;
		if(h[i]=='0') ans1++;
		if(ans>0&&ans1>0) return 'F';
	}
	if(ans>0) return 'I';
	else return 'B';
}
void dfs(int x) {
	if(tree[x].data.size()==0) {
		return ;
	}
	dfs(x*2);
	dfs(x*2+1);
	cout<<pd(tree[x].data);
}
signed main() {
	cin>>n>>s;
	tree[1].data=s;
	queue<xd> q;
	q.push((xd){1,s});
	while(1) {
		o=q.front();
		q.pop();
		if(o.f.size()==1) {
			break;
		}
		string e,w;
		for(int i=0;i<o.f.size()/2;i++) {
			e.push_back(o.f[i]);
		}
		q.push((xd){o.ty*2,e});
		tree[o.ty*2].data=e;
		for(int i=o.f.size()/2;i<o.f.size();i++) {
			w.push_back(o.f[i]);
		}
		q.push((xd){o.ty*2+1,w});
		tree[o.ty*2+1].data=w;
	}
	dfs(1);
} 

华丽结束

标签:NOIP2004,10,ty,int,tree,P1087,push,FBI,data
From: https://blog.csdn.net/Aa12345678bbb/article/details/136114396

相关文章

  • 洛谷P10878 [JRKSJ R9] 在相思树下 III && 单调队列
    传送门:P10878[JRKSJR9]在相思树下III将军啊,早卸甲,他还在廿二,等你回家……一道练习单调队列的好题qwq题目意思:很明白了,不再复述。(注意$\foralli$表示对于任意的i,可理解为所有)思路:贪心是很明显的,因为我们要让最后的值最大,首先要把小的值删掉。最后的答案就是进......
  • P1091 [NOIP2004 提高组] 合唱队形
    这道题主要考察的是线性dp,最基础的dp,这道题的主要思路1.求出最大子序列,2.求出最小子序列,3.找出最少要多少个人要出列。其实我们主要2可以变成逆序查找最大子序列,所以我们只需要把前两个找出来之后我们就可以求出主要3(注意一定要减1,因为中间的那个同学一定会被多算一次所以必......
  • Goby漏洞发布 | CVE-2024-38856 Apache OFbiz /ProgramExport 命令执行漏洞【已复现】
    漏洞名称:ApacheOFbiz/ProgramExport命令执行漏洞(CVE-2024-38856)EnglishName:ApacheOFbiz/ProgramExportCommandExecutionVulnerability(CVE-2024-38856)CVSScore:9.0漏洞描述:ApacheOFBiz是一个电子商务平台,用于构建大中型企业级、跨平台、跨数据库、跨应用服务器的......
  • Apache OFBiz 授权不当致远程代码执行漏洞(CVE-2024-38856)
    0x01产品简介ApacheOFBiz是一个电子商务平台,用于构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式电子商务类应用系统。是美国阿帕奇(Apache)基金会的一套企业资源计划(ERP)系统。该系统提供了一整套基于Java的Web应用程序组件和工具。0x02漏洞概述2024年8月......
  • [NOIP2004 提高组] 虫食算(含代码)
    [NOIP2004提高组]虫食算题目描述所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的数字。来看一个简单的例子:43#9865#045......
  • 「漏洞复现」Apache OFBiz 路径遍历漏洞(CVE-2024-36104)
    0x01 免责声明请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。本次测试仅供学习使用,如若非法他用,与平台和本文作者无关,需......
  • 洛谷P1087 FBI树
    洛谷P1087递归建立树,根据当前树的类型,选择“F”“B”“I”voidbuild(intdepth,intstart,intend,introot){if(depth>=n+1)return;intcurrent=root;intflag=check(start,end);if(flag==0)t[current].self='B';elseif(flag==......
  • 【c++提高组】津津的储蓄计划(NOIP2004)
    题目描述津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上 20%还给津津。因此津津制定了一个储蓄计划:每个月的......
  • CSP历年复赛题-P1087 [NOIP2004 普及组] FBI 树
    原题链接:https://www.luogu.com.cn/problem/P1087题意解读:字符串作为根,左边一半作为左子树,右边一半作为右子树,递归构造数,并按FBI规则输出后续遍历结果。解题思路:按照题意,通过dfs来构造树,对于字符串str,提取左边一半递归构造左子树,提取右边一半递归构造右子树,前提是字符串长度>1......
  • CSP历年复赛题-P1085 [NOIP2004 普及组] 不高兴的津津
    原题链接:https://www.luogu.com.cn/problem/P1085题意解读:找到两数之和大于8且两数之和最大值的位置解题思路:不多说,送分题,直接模拟法即可100分代码:#include<bits/stdc++.h>usingnamespacestd;inta,b;intmaxx,maxn;intmain(){for(inti=1;i<=7;i++)......