P1087 FBI树

题目描述

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

FBIFBI树是一种二叉树,它的结点类型也包括FF结点,BB结点和I结点三种。由一个长度为2^N2N的“0101”串S可以构造出一棵FBIFBI树TT,递归的构造方法如下:

1) TT的根结点为RR,其类型与串SS的类型相同;

2) 若串SS的长度大于11,将串SS从中间分开,分为等长的左右子串S_1S1S_2S2;由左子串S_1S1构造R的左子树T_1T1,由右子串S_2S2构造RR的右子树T_2T2

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

输入输出格式

输入格式:

 

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

第二行是一个长度为2^N2N的“0101”串。

 

输出格式:

 

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

 

输入输出样例

输入样例#1: 复制
3
10001011
输出样例#1: 复制
IBFBBBFIBFIIIFF

说明

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

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

noip2004普及组第3题

#include<bits/stdc++.h>
using namespace std;
string s;
int n;
void dfs(int l,int r){
    if(l<r){
        dfs(l,(r+l)/2);
        dfs((r+l+1)/2,r);
    }
    bool flag1=0,flag2=0;
    for(int i=l;i<=r;i++)
      if(s[i]=='0')
        flag1=1;
      else
        flag2=1;
    if(flag1==1&&flag2==1)
      printf("F");
    if(flag1==1&&flag2==0)
      printf("B");
    if(flag1==0&&flag2==1)
      printf("I");
}
// 0 1 2 3 4 5 6 7
int main(){
    cin>>n>>s;
    n=pow(2,n)-1;
    dfs(0,n);
}
#include<bits/stdc++.h>
using namespace std;
string s;
char t[3]; 
int zzb[3][3]=
{0,2,2,
 2,1,2,
 2,2,2};
int dfs(int l,int r)
{
    if(l==r)
    {
        cout<<t[s[l]-'0'];
        if(s[l]=='0')
            return 0;
        else
            return 1;    
    }
    int mid=(l+r)/2;
    int t1=dfs(l,mid);
    int t2=dfs(mid+1,r);
    int t3=zzb[t1][t2];
    cout<<t[t3];
    return t3; 
}
int main()
{
    t[0]='B';
    t[1]='I';
    t[2]='F';
    int n;
    cin>>n;
    cin>>s;
    int l,r;
    l=0;r=s.size()-1;
    dfs(l,r);
    return 0;
}

 

posted @ 2019-07-03 20:34  Crazily  阅读(227)  评论(0编辑  收藏  举报