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. pyqt5-信号与槽

    个人理解:pyqt5的信号就是C++中事件,比如鼠标单击事件;pyqt5中的槽就是c++事件函数,比如单击之后要去执行的函数 例子一 一个信号连接一个槽 import sysfrom PyQt5.Qt ...

  2. IOS上编译boost库

    环境:xcode9mac os 10.13 1.下载boost库并解压2.cd到解压后的文件包内,执行 sh bootstrap.sh(解压后会得到这个脚本文件).3.执行./b2 编译整个库.4.经 ...

  3. python学习理论

    结论 其实学python这本书 不一定要全部敲一遍 在“”动手试一试“”里面 把这篇学到的东西测试一下就算是掌握了 要在实际工作场景当中使用还需要进一步练习这样做的话 比较好一点 边学边测试 加深掌握 ...

  4. luogu P2661 信息传递 x

    P2661 信息传递 题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知 ...

  5. docker安装xxl-job

    一 安装mysql root@localhost tmp]# docker run -itd --name xxl-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD= ...

  6. lookup-method和replace-method注入

    官方文档说明: 在Spring5核心的1.4.6章节 在大多数应用程序方案中,容器中的大多数bean都是 singletons .当单例bean需要与另一个单例bean协作或非单例bean需要与另一个 ...

  7. Selenium 多窗口切换

    我们在操作网页的时候,点击有些页面的链接,会重新打开一个窗口,我们要在新页面上操作,就得切换窗口 比如在百度首页的登录框点击注册,会重新打开一个注册的新页面,要在新页面注册,就得先切进新页面 那我们怎 ...

  8. 配置Nginx和Apache允许指定域名CORS跨域访问

    前后端分离开发,导致前端项目需要跨域请求后端接口,解决方法有很多,本文只介绍两个: 1. 修改后端程序代码实现允许跨域请求 2. 修改服务器配置文件实现允许跨域请求 正文: 方法1:修改后端程序代码实 ...

  9. @清晰掉 GNU C __attribute__

    __attribute__((packed))详解 1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有 ...

  10. 使用collection查询集合属性

    介绍resultMap中使用collection查询集合属性 业务需求,查询部门中的多个人员 public class Department { private Integer id; private ...