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를 입력합니다.n의 첫 번째 줄은 정수 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[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("
"); return 0; }

좋은 웹페이지 즐겨찾기