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. maven项目使用自己创建的jar包--maven without test code

    eclipse版本为2018-12(4.10.0) 1.创建一个jar包 首先自己建立了一个maven project,名为jweb.GAV坐标: <groupId>amberai< ...

  2. #383 Div1 Problem B Arpa's weak amphitheater.... (分组背包 && 并查集)

    题意 : 有n个人,每个人都有颜值bi与体重wi.剧场的容量为W.有m条关系,xi与yi表示xi和yi是好朋友,在一个小组. 每个小组要么全部参加舞会,要么参加人数不能超过1人. 问保证总重量不超过W ...

  3. pycharm问题集锦

    1.pycharm的激活方式 参考博客https://blog.csdn.net/u014044812/article/details/78727496 2.总是出现波浪线,如下问题 问题原因:knn ...

  4. macOS 更新 git 命令提示 xcrun,.gitignore 配置不生效问题。

    macOS 更新 运行git提示xcrun: error: invalid active developer path 在终端输入 xcode-select --install 即可以解决该问题 .g ...

  5. 【转】毛虫算法——尺取法

    转自http://www.myexception.cn/program/1839999.html 妹子满分~~~~ 毛毛虫算法--尺取法 有这么一类问题,需要在给的一组数据中找到不大于某一个上限的&q ...

  6. css实现不定宽高的div水平、垂直居中

    一共有三个方案: 1,第一种方案主要使用了css3中transform进行元素偏移,效果非常好 这方法功能很强大,也比较灵活,不仅仅局限在实现居中显示.  兼容方面也一样拿IE来做比较,第二种方法IE ...

  7. JDK中String类的源码分析(二)

    1.startsWith(String prefix, int toffset)方法 包括startsWith(*),endsWith(*)方法,都是调用上述一个方法 public boolean s ...

  8. JavaScript DOM位置尺寸API

    我们需要了解几个基础概念,每个HTML元素都有下列属性 offsetWidth clientWidth scrollWidth offsetHeight clientHeight scrollHeig ...

  9. Oracle开发:常用的数据库字段类型[转]

    Oracle常用的数据库字段类型如下: 字段类型 中文说明 限制条件 其它说明 CHAR 固定长度字符串 最大长度2000 bytes VARCHAR2 可变长度的字符串 最大长度4000 bytes ...

  10. Spring Data JPA学习笔记

    下面先来介绍一下JPA中一些常用的查询操作: //And --- 等价于 SQL 中的 and 关键字,比如 findByHeightAndSex(int height,char sex): publ ...