SDNU 1168.FBI 트리[NOIP 2004 보급팀][부건수][7월 28]
문제를 푸는 사고방식은 한 가지가 아니라 아마도 더 좋은 풀이가 있을 것이다.영감은 한순간에
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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java 백엔드에서 데이터를 트리로 변환하고 맵은 json 트리를 생성하여 백엔드로 되돌려줍니다. (백엔드 변환)java 백엔드, 데이터를 트리로 변환하고,map는 json 트리를 생성하여 전방으로 되돌려줍니다(백엔드 변환) 1. 왜 이런 블로그를 쓰나요? 2.java 백엔드 코드 3. 전환된 데이터는 다음과 유사한 형식으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.