1058FBI

2632 단어
문제 설명은 "0"과 "1"으로 구성된 문자열을 세 종류로 나눌 수 있습니다. "0"열을 B열, "1"열을 I열, "0"과 "1"을 포함하는 열을 F열이라고 합니다.FBI 트리는 두 갈래 나무로 결점 유형도 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 트리를 구성하고 그 뒷순서를 출력하십시오.형식 입력 첫 번째 줄은 정수 N(0 <= N <= 10)이고 두 번째 줄은 길이가 2N인 "01"줄입니다.출력 형식은 한 줄만 포함하고, 이 줄은 FBI 트리의 뒷순서를 훑어보는 문자열만 포함합니다.샘플 입력 3 10001011 샘플 출력 IBFBBBFIBFIIIFF 데이터 규모와 약정 40%에 대한 데이터, N<=2;모든 데이터에 대해 N<=10.주:[1] 두 갈래 나무: 두 갈래 나무는 결점의 유한한 집합이다. 이 집합은 공중집합이거나 한 뿌리 결점과 두 그루가 교차하지 않는 두 갈래 나무로 구성된다.이 두 그루의 서로 교차하지 않는 두 갈래 나무를 각각 이 뿌리 결점의 왼쪽 나무와 오른쪽 나무라고 부른다.
[2] 뒷차례 반복: 뒷차례 반복은 깊이가 두 갈래 나무를 우선적으로 반복하는 방법이다. 그의 귀속 정의는 앞뒤 차례대로 왼쪽 나무를 훑어보고 뒤이어 오른쪽 나무를 훑어보고 마지막으로 뿌리를 방문하는 것이다.
법1: 직접 귀속
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
string str;
void fbi(int l,int r)
{
    if(l>r)
        return ;
    int mid=(l+r)/2,B=0,I=0;
    if(l!=r){
        fbi(l,mid);
        fbi(mid+1,r);
    }
    while(l<=r)if(str[l++]=='0')B++;else I++;
    if(B!=0&&I!=0) printf("F");
    else if(I!=0&&B==0)printf("I");
    else printf("B");
     
     
}
int main ()
{
    int n;
    scanf("%d",&n);
    cin>>str;
    fbi(0,(int)str.size()-1);
    printf("
"); return 0; }
법2: 나무 세우기
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[2000],r[2800];
void build_FBI(int k,int left,int right)//k= 
{
    if(left==right)// , , 0;
    {
        r[k]=s[right];
        return;
    }
    int mid=(left+right)/2;
    build_FBI(2*k,left,mid);
    build_FBI(2*k+1,mid+1,right);
    if(r[2*k]=='0'&&r[2*k+1]=='0')r[k]='0';
    else if(r[2*k]=='1'&&r[2*k+1]=='1')r[k]='1';
    else r[k]='2';
}
void dfs(int v){// 
    if(r[2*v])
        dfs(2*v);
    if(r[2*v+1])
        dfs(2*v+1);
    if(r[v]=='0')
        printf("B");
    else if(r[v]=='1')
        printf("I");
    else
        printf("F");
}
int main()
{
    int n;
    scanf("%d",&n);
    scanf("%s",s+1);// 1 
    build_FBI(1,1,(int)strlen(s+1));
    dfs(1);
    printf("
"); }

좋은 웹페이지 즐겨찾기