【6.10校内test】T1 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树的更多相关文章
- Vijos 1114 FBI树
描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含"0&quo ...
- 蓝桥杯之FBI树问题
问题描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含"0&q ...
- noip普及组2004 FBI树
FBI树 描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含" ...
- Vijos P1114 FBI树【DFS模拟,二叉树入门】
描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树1,它的结点类型也包括F结点,B结点和I结点三种 ...
- [题解]ybt1365:FBI树(fbi)
ybt1365:FBI树(fbi) [题目描述] 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树,它 ...
- FBI树-数据结构(二叉树)
问题 B: [2004_p4]FBI树-数据结构 时间限制: 1 Sec 内存限制: 125 MB提交: 57 解决: 46 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称 ...
- C语言 · FBI树
算法训练 FBI树 时间限制:1.0s 内存限制:256.0MB 锦囊1 二叉树. 问题描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I ...
- FBI树(第一次做建树题)
试题来源 NOIP2004 普及组 问题描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树,它的结 ...
- code vs 1094 FBI树 2004年NOIP全国联赛普及组
题目描述 Description 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树[1],它的结点类型 ...
随机推荐
- 带 like 的字符串匹配查询
1.百分号通配符 '%' ,匹配任意长度的字符,甚至包括零字符 例:查询所有以 'a' 字母开头的水果,sql 语句如下 select f_id,f_name from fruits wher ...
- ArrayList的contains()和HashSet的contains()效率比较
ArrayList的contains(Object o)方法内部只有一行代码:判断indexOf(0)是否大于等于0.而indexOf(o)内部会从头遍历数组,直到某位置的元素等于o,极端情况下,要把 ...
- 基于STM32的CRC校验说明
///***************************************************************************** //下面是test.c里面的函数 // ...
- 实战build-react(三)
安装 redux-thunk yarn add redux-thunk 或 npm install redux-thunk --save https://github.com/zalmoxisus/r ...
- POJ 2492 A Bug's Life (带权并查集 && 向量偏移)
题意 : 给你 n 只虫且性别只有公母, 接下来给出 m 个关系, 这 m 个关系中都是代表这两只虫能够交配, 就是默认异性, 问你在给出的关系中有没有与异性交配这一事实相反的, 即同性之间给出了交配 ...
- sh_01_重复执行
sh_01_重复执行 # 打印 500 遍 Hello Python(复制粘贴的方法,手动复制500次) print("Hello Python") print("Hel ...
- 洛谷P4208 [JSOI2008]最小生成树计数——题解
题目传送 前置知识:对于同一个图的所有最小生成树,权值相等的边的数量相同. 可以简单证明一下: 我们可以从kruskal的过程考虑.这个算法把所有边按权值大小从小到大排序,然后按顺序看每条边,只要加上 ...
- python3.7--pycharm selenium自启360浏览器/360极速浏览器方法
写于:2019.01.02(实测日) 参考文档:https://blog.csdn.net/five3/article/details/50013159 一.下载360浏览器或360极速浏览器的Chr ...
- Java并发编程的艺术笔记(三)——Thread.join()
t.join()方法只会使主线程进入等待池并等待t线程执行完毕后才会被唤醒.并不影响同一时刻处在运行状态的其他线程.它能够使得t.join()中的t优先执行,当t执行完后才会执行其他线程.能够使得线程 ...
- python之正则匹配match:search findall
match:从开头位置匹配,只匹配一次,开头匹配不上,则不继续匹配 a,b,\w+ match(a,"abcdef") 匹配a >>> re.match(&quo ...