专栏文章

题解:P1087 [NOIP 2004 普及组] FBI 树

P1087题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipvcsh1
此快照首次捕获于
2025/12/03 18:33
3 个月前
此快照最后确认于
2025/12/03 18:33
3 个月前
查看原文
这题理论上来说是考二叉树的,但是呢,当时我做这道题的时候刚刚学完线段树,于是......
小知识:线段树的递归建树过程就是一个后序遍历,所以我们可以直接用线段树的建树函数改造得到这道题的答案。
具体的,我们将整个串输入,之后像线段树递归那样,在这个 0101 串上建树,建好之后,按照题意合并两个子节点的对应串:
  1. 对于叶子节点,若是 00 就为 BB 串,反之为 II 串。
  2. B+B=B,I+I=I,B+I=F,I+B=F,F+(B/I/F)=FB+B=B,I+I=I,B+I=F,I+B=F,F+(B/I/F)=F
按照上面的小知识,当求出每一个节点对应的类型时,直接输出,最终得到的就是答案。
上代码:
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=10050;
char sgt[N]={0};
void build(int tt,string s)
{
	if(s.size()==1)
	{
		if(s[0]=='0')sgt[tt]='B';
		else sgt[tt]='I';
		cout<<sgt[tt];
		return ;
	}
	int mid=s.size()/2;
	build(tt*2,s.substr(0,mid));
	build(tt*2+1,s.substr(mid,mid));
	if(sgt[tt*2]=='I'&&sgt[tt*2+1]=='I')sgt[tt]='I';
	else if(sgt[tt*2]=='B'&&sgt[tt*2+1]=='B')sgt[tt]='B';
	else sgt[tt]='F';
	cout<<sgt[tt];
	return ;
}
int main()
{
	int n;
	string s;
	cin>>n;
	cin>>s;
	build(1,s);
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...