FBI树【题目链接】

感觉我超废。


MY SOLUTION:
     我的想法其实也是很简单的,递归的去做,因为最后要求输出FBI的后序遍历,也就是左右头,我的方法是递归存字符数组,(按照与后序遍历完全相反的顺序存的),然后倒序输出。非常遗憾的是,因为开始时写递归写炸了(微笑),于是我修改递归变成了main函数里先进行判整个串,当n=0时,就输出了两位。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; int n, cnt;
char a[];
char c[]; int pd(int x, int y) {//写了一个复杂的判断函数
if (x == y) {
if (a[x] == '') return ;
else return ;
} for (int i = x + ; i <= y; i++)
if (a[i] != a[i - ]) return ; if (a[x] == '') return ; if (a[x] == '') return ;
} int solve(int f, int len) {
int d = (len + f) >> ;
int num = len;
if (f > len)
return ;
if (pd(f, len) == )
c[++cnt] = 'F';
if (pd(f, len) == )
c[++cnt] = 'I';
if (pd(f, len) == )
c[++cnt] = 'B'; if (f == len)
return ;
len >>= ;
solve(d + , num);
solve(f, d);
return ;
} int main() {
scanf("%d", &n);
scanf("%s", a + );//输入 from a[1];
int len = strlen(a + );//求a[1] to a[len] 的长度;
if (pd(, len) == )
c[] = 'F';
if (pd(, len) == )
c[] = 'I';
if (pd(, len) == )
c[] = 'B';
cnt++;
int g = len >> ;
solve(g + , len);//因为后序遍历,故先递归右子树
solve(, g);
if (n == ) {//被坑的地方,因为n==0时,如果按我的递归方式cnt=2;
cout << c[] << endl;
return ;
}
for (int i = cnt; i >= ; i--) cout << c[i];
return ;
}

我想改一改我的这个代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; int n, cnt;
char a[];
char c[]; int pd(int x, int y) {
for (int i = x + ; i <= y; i++)
if (a[i] != a[i - ])
return ;
if (a[x] == '')
return ;
if (a[x] == '')
return ;
} int solve(int f, int len) {
if(f==len) {if(a[f]=='') c[++cnt]='I';
else c[++cnt]='B';
return ;}
int d = (len + f) >> ;
if(f>len) return ;
if (pd(f, len) == )
c[++cnt] = 'F';
if (pd(f, len) == )
c[++cnt] = 'I';
if (pd(f, len) == )
c[++cnt] = 'B';
solve(d+,len); solve(f,d);
return ;
} int main() {
scanf("%d", &n);
scanf("%s", a + );
int len = strlen(a + ); solve(, len); for (int i = cnt; i >= ; i--) cout << c[i];
return ;
}

WATER_LIFT'S SOLUTION:(是我手打的但思路是water_lift的)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; int n, cnt;
char a[];
char c[]; int pd(int x, int y) {
if (x == y) {
if (a[x] == '') return ;
else return ;
} for (int i = x + ; i <= y; i++)
if (a[i] != a[i - ]) return ; if (a[x] == '') return ;
if (a[x] == '') return ;
} int solve(int f, int len) {
if(f==len) {
if(a[f]=='') cout<<"I";
if(a[f]=='') cout<<"B";
return ;
}
int d = (len + f) >> ;
solve(f,d);
solve(d+,len);
if (pd(f, len) == )
cout<<"F";
if (pd(f, len) == )
cout<<"I";
if (pd(f, len) == )
cout<<"B";
return ;
} int main() {
scanf("%d", &n);
scanf("%s", a + );
int len = strlen(a + ); solve(,len);
return ;
}

至于water_lift的非暴力算法,大家看看就好:

#include <iostream>
#include <string>
using namespace std;
int n;
string s;
char dfs(int l, int r)
{
if (l == r)
{
if (s[l] == '')
{
cout << 'B';
return 'B';
}
else if (s[l] == '')
{
cout << 'I';
return 'I';
}
}
int mid = (l + r) / ;
char le = dfs(l, mid);
char ri = dfs(mid + , r);
if (le == 'B' && ri == 'B')
{
cout << 'B';
return 'B';
}
if (le == 'I' && ri == 'I')
{
cout << 'I';
return 'I';
}
cout << 'F';
return 'F';
}
int main()
{
freopen("fbi.in", "r", stdin);
freopen("fbi.out", "w", stdout);
cin >> n >> s;
dfs(, ( << n) - );
cout << endl;
}

end-

【6.10校内test】T1 FBI树的更多相关文章

  1. Vijos 1114 FBI树

    描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含"0&quo ...

  2. 蓝桥杯之FBI树问题

    问题描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含"0&q ...

  3. noip普及组2004 FBI树

    FBI树 描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含" ...

  4. Vijos P1114 FBI树【DFS模拟,二叉树入门】

    描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树1,它的结点类型也包括F结点,B结点和I结点三种 ...

  5. [题解]ybt1365:FBI树(fbi)

    ybt1365:FBI树(fbi) [题目描述] 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树,它 ...

  6. FBI树-数据结构(二叉树)

    问题 B: [2004_p4]FBI树-数据结构 时间限制: 1 Sec  内存限制: 125 MB提交: 57  解决: 46 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称 ...

  7. C语言 · FBI树

    算法训练 FBI树   时间限制:1.0s   内存限制:256.0MB        锦囊1 二叉树. 问题描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I ...

  8. FBI树(第一次做建树题)

    试题来源 NOIP2004 普及组 问题描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树,它的结 ...

  9. code vs 1094 FBI树 2004年NOIP全国联赛普及组

    题目描述 Description 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树[1],它的结点类型 ...

随机推荐

  1. Spring对单例的底层实现,单例注册表

    Spring框架对单例的支持是采用单例注册表的方式进行实现的,源码如下: public abstract class AbstractBeanFactory implements Configurab ...

  2. 10.django的一些方法理解

    django get_object_or_404 get_object_or_404是django的django shortcuts的方法,用来查询数据,或者抛出一个DoesNotExist的异常 用 ...

  3. jmeter--单个接口通,自动化不通时

    单个接口通,自动化不通时,对比两者请求 post 请求的格式,内容编码

  4. POJ 2186 挑战 --牛红人 强连通分量——Tarjan

    题意:n头奶牛,给出若干个欢迎关系a b,表示a欢迎b,欢迎关系是单向的,但是是可以传递的,如:a欢迎b,b欢迎c,那么a欢迎c .另外每个奶牛都是欢迎他自己的.求出被所有的奶牛欢迎的奶牛的数目.#i ...

  5. go语言系列--输出正弦函数

    实验所用到的标准库和包 库与包之间的理解可以类比成:数据库种的库和表 库名 作用 image 常见图形格式的访问及生成 log 日志记录库 math 数学库 os 操作系统平台不依赖平台操作封装 查看 ...

  6. [BZOJ2987]Earthquake:类欧几里得算法

    分析 类欧的式子到底是谁推的啊怎么这么神仙啊orz! 简单说一下这道题,题目中的约束条件可以转化为: \[ y \leq \frac{c-ax}{b} \] 有负数怎么办啊?转化一下: \[ y \l ...

  7. React用dangerouslySetInnerHTML动态渲染HTML

    React用dangerouslySetInnerHTML动态渲染HTML React项目,需要把后台返回的一段html代码在页面上显示 在render获取内容, //在render里获取内容 con ...

  8. Vue中基本指令用法

    指令在Vue中是个很重要的功能,在Vue项目中是必不可少的.根据官网的介绍,指令 (Directives) 是带有 v- 前缀的特殊属性.指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地 ...

  9. 一款基于jQuery Ajax的等待效果

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  10. JavaScript 事件不触发

    在class上绑定的事件,点击图片的时候无法触发 <div id="files" class="files"> <div> <p& ...