SDNU 1168.FBI树【NOIP 2004 普及组】【不建树】【7月28】

FBI树

解题的思路不止一种,或许还有更优的解。灵感就在一瞬间

Description

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

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

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

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

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

Input

输入文件fbi.in的第一行是一个整数N(0 <= N <= 10),第二行是一个长度为2N的“01”串。

Output

输出文件fbi.out包括一行,这一行只包含一个字符串,即FBI树的后序遍历序列。

Sample Input

3
10001011

Sample Output

IBFBBBFIBFIIIFF

这道题是我思考了一段时间才做的。看过YG跟WYC的思路,都是建树之后再后序遍历,我就在想,可不可以不建树,因为本身建树的一个过程就是遍历的过程,只是遍历的顺序不一样。后来发现,完全可以用递归实现的。对于一组数据字符串s的遍历顺序是这样的:s[0]->s[1]->s[0]+[s1]->s[2]->s[3]->s[2]+s[3]->s[0]+s[1]+s[2]+s[3]......代码如下:

#include<cstdio>
#include<cstring>
char s[1100];
int FBI(int start,int len){//两个变量,start起始位置,len长度
    if(len==1){
        if(s[start]=='0'){
            printf("B");
            return 0;
        }
        else{
            printf("I");
            return 1;
        }
    }
    else{//返回0说明全为0,返回1说明全为1,否则返回2
        int x=FBI(start,len/2);
        int y=FBI(start+len/2,len/2);
        if(x==y&&x==0){
            printf("B");
            return 0;
        }
        else if(x==y&&x==1){
            printf("I");
            return 1;
        }
        else{
            printf("F");
            return 2;
        }
    }
}
int main(){
    int n;//其实这样做,n是一个无用的变量
    scanf("%d%s",&n,s);
    int l=strlen(s);
    FBI(0,l);
    printf("\n");
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-04 11:43:30

SDNU 1168.FBI树【NOIP 2004 普及组】【不建树】【7月28】的相关文章

【递归】Vijos P1114 FBI树(NOIP2004普及组第三题)

题目链接: https://vijos.org/p/1114 题目大意: 把01串一分为二,左半边描述当前节点左子树,右半边描述右子树,子树全为1则为I节点,全为0则为B节点,混合则为F节点,直到当前串长度为1停止. 给定01串,求FBI树后序. 题目思路: [递归] 每次操作先操作左子树,再操作右子树,之后统计左右子树01状态,按照要求得到当前节点是 F B I中的哪一个. 由于输出后序,所以可以每次操作完左右子树后直接输出该节点,当前串长度为1则输出完返回. 1 // 2 //by cool

SDNU 1167.花生采摘【NOIP 2004 普及组】【贪心】【8月6】

花生采摘 Description 鲁宾逊先生有一只宠物猴,名叫多多.这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:"欢迎免费品尝我种的花生!--熊字". 鲁宾逊先生和多多都很开心,因为花生正是他们的最爱.在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格(如图1).有经验的多多一眼就能看出,每棵花生植株下的花生有多少.为了训练多多的算术,鲁宾逊先生说:"你先找出花生最多的植株,去采摘它的花生:然后再找出剩下的植株里花生最多的,去采摘

[Wikioi 2808][NOIP 1998普及组]二的幂次方---HBNU的童鞋过来看看

转载请说明出处:http://blog.csdn.net/cywosp/article/details/27095723 <黑天鹅--如何应对不可预知的未来> 作者:纳西姆?尼古拉斯?塔勒布 关于黑天鹅 在发现澳大利亚黑天鹅之前,所有欧洲人都确信天鹅全部都是白色的,人们在经过上百万次的确定性观察白天鹅之后得到了这一结论,而且一直延续了上千年,直到黑天鹅的出现,从而将这一结论完全打破.通过黑白天鹅的现象说明我们通过观察或经验获得的知识具有严重的局限性和脆弱性,仅仅一次的完全不同的发现就足以颠覆根

NOIP 2015普及组复赛Day1 T1 == Codevs4510 神奇的幻方

时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description: 幻方是一种很神奇的N∗N矩阵:它由数字 1,2,3, … … ,N∗N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将 1写在第一行的中间.之后,按如下方式从小到大依次填写每个数(K= 2,3, … ,N∗N ): 1.若 (K−1)在第一行但不在最后一列,则将 填在最后一行,(K−1)所在列的右一列: 2.若 (K

【NOIP】普及组2011 表达式的值

[算法]动态规划+后缀表达式 [题解] 先把算式转为后缀表达式后进行DP 令f[s][0]表示使表达式答案为0的方案数 f[s][1]表示使表达式答案为1的方案数 (加法) f[a+b][1]=f[a][0]*f[b][1]+f[a][1]*f[b][0]+f[a][1]*f[b][1] f[a+b][0]=f[a][0]*f[b][0] (乘法) f[a+b][0]=f[a][0]*f[b][0]+f[a][0]*f[b][1]+f[a][1]*f[b][0]f[a+b][1]=f[a][1]

[NOIP&#183;2001普及组] 数的划分

[题目描述] 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 1.不作任何处理: 2.在它的左边加上一个自然数,但该自然数不能超过原数的一半: 4.加上数后,继续按此规则进行处理,直到不能再加自然数为止. [题目分析] 看到这道题,最容易的想法就是递归,也是最简单的方法.只要递归看一下某一个数能不能满足如上条件就行.ans一定要是1,因为不作任何处理算一种处理方式. #include<stdio.h>

NOIP 2016 普及组Solution

第一题 直接贴Code: 1 #include <cstdio> 2 int min(int a,int b) 3 { 4 return a<b?a:b; 5 } 6 using namespace std; 7 int main() 8 { 9 int n,a1,a2,b1,b2,c1,c2,ans; 10 scanf("%d%d%d%d%d%d%d",&n,&a1,&a2,&b1,&b2,&c1,&c2);

全排列(洛谷1061 Jam的计数法or NOIP 2006 普及组 第三题)

Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩. 在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字母按原先的顺序,排在前面的字母小于排在它后面的字母.我们把这样的“数字”称为Jam数字.在Jam数字中,每个字母互不相同,而且从左到右是严格递增的.每次,Jam还指定使用字母的范围,例如,从2到10,表示只能使用{b,c,d,e,f,g,h,i,j}这些字母.如果再规定位数为5,那么,紧接在Jam数字“bd

[Noip 2009 普及组 T4] [Luogu P1070] 道路游戏

一道很迷的\(dp\). 感谢大爱无疆的sy 开始的时候采用的二维状态但是并不对) 然后把状态改成一维\(AC\) \(Solution\): 状态:开始想的是\(f[i][j]\),表示到达\(i\)时间时在\(j\)点处的最多金币数. 转移方程设置为:\(f[i][j]=max\{f[i-1][j-k]+sum-val[j-k]\}\)其中\(sum\)表示从\(j-k\)走到\(j\)所赚的金币数 但这样是不对的,因为题目中: 也就是上一个机器人消失的地方并不一定要买下一个机器人,而是可以