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_1S1和S_2S2;由左子串S_1S1构造R的左子树T_1T1,由右子串S_2S2构造RR的右子树T_2T2。
现在给定一个长度为2^N2N的“0101”串,请用上述构造方法构造出一棵FBIFBI树,并输出它的后序遍历序列。
输入输出格式
输入格式:
第一行是一个整数N(0 \le N \le 10)N(0≤N≤10),
第二行是一个长度为2^N2N的“0101”串。
输出格式:
一个字符串,即FBIFBI树的后序遍历序列。
输入输出样例
说明
对于40%的数据,N \le 2N≤2;
对于全部的数据,N \le 10N≤10。
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; }