洛谷P1087 FBI树
P1087 FBI树题解:
看到这个题,我想到了线段树!(毕竟刚搞完st表。。。)
当然,题解中有位大佬也用的线段树,但是当时看的时候我看见了9个if,当场去世。
那么这是一个不用暴力的线段树,且简单易懂。
(所以我认为我的方法还是可以供大家参考的。求过。。。。。。)
正解:
根据题意中“将串S从中间分开,分为等长的左右子串S1和S2” 和现在给定一个长度为2^n的“01”串可知:给定字符串一定位诸如16,8,4,2,1之类的二的指数幂,并且一定满足可以被均分n次,因为原字符串长度就是2^n的, 那么,我们可以建树如下:
F 长度为8
F F 长度为4
F B F I 长度为2
I B B B I B I I长度为1
| | | | | | | |
| | | | | | | |
1 0 0 0 1 0 1 1
是不是特别像线段树QWQ
这里我们要用到一个法则:
1,如果其两个子串同为‘I’或者同为‘B’,那么两个子串合二为一后也为对应的‘I’或者‘B’。
2,子串中只要有一个为‘F’,那么他们合起来组成的字符串一定为‘F’。
证明:利用了题目中的性质:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。 也就是说两个子串中只要都是‘B’或者‘F’的话,他们合起来一定也只有一种字符‘0’或者‘1’,但是子串中只要有一个为‘F’,那么他们合起来一定即含有1也含有0,那么他一定是一个01串,就是‘F’。证毕。
然后再按照后序遍历,即可得到答案:
IBFBBBFIBFIIIFF
AC代码如下:
#include<cstdio>
#include<cstring>
using namespace std;
int n,zero=0,one=0,lenb;
char b[1025];
char dis[1025][12];
inline void chuli()
{
for(int i=0;i<lenb;i++)
{
if(b[i]=='1')dis[i][0]='I';
if(b[i]=='0')dis[i][0]='B';//底层初始化
}
for(int j=1;j<=n;j++)
for(int i=0;i+(1<<j)-1<lenb;i+=(1<<j))
{
if(dis[i][j-1]=='B'&&dis[i+(1<<(j-1))][j-1]=='B')
dis[i][j]='B';//只要满足左右子树都为‘F’或者‘B’,他们合起来就是‘B’或‘F’
else
if(dis[i][j-1]=='I'&&dis[i+(1<<(j-1))][j-1]=='I')
dis[i][j]='I';//只要满足左右子树都为‘F’或者‘B’,他们合起来就是‘B’或‘F’
else dis[i][j]='F';//否则,其他情况都是F
}
}
inline void print(int i,int n)
{
if(n>0)
{
print(i,n-1);//左子树
print(i+(1<<(n-1)),n-1);//右子树
}
printf("%c",dis[i][n]);//输出当前节点
}
int main(){
freopen("fbi.in","r",stdin);
freopen("fbi.out","w",stdout);
scanf("%d",&n);
scanf("%s",b);
lenb=strlen(b);
chuli();//可以说是很形象了
print(0,n);//后序遍历并输出
return 0;
}
完结QWQ
本蒟蒻真心希望能帮助到各位大佬
洛谷P1087 FBI树的更多相关文章
- 洛谷1087 FBI树 解题报告
洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...
- 洛谷P3018 [USACO11MAR]树装饰Tree Decoration
洛谷P3018 [USACO11MAR]树装饰Tree Decoration树形DP 因为要求最小,我们就贪心地用每个子树中的最小cost来支付就行了 #include <bits/stdc++ ...
- 洛谷:P1087 FBI树 P1030 求先序排列 P1305 新二叉树
至于为啥把这三个题放到一起,大概是因为洛谷的试炼场吧,三道树的水题,首先要理解 先序中序后序遍历方法. fbi树由于数量小,在递归每个区间时,暴力跑一遍区间里的数,看看是否有0和1.至于递归的方法,二 ...
- NOIP2017提高组Day2T3 列队 洛谷P3960 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/9265380.html 题目传送门 - 洛谷P3960 题目传送门 - LOJ#2319 题目传送门 - Vij ...
- 洛谷P3703 [SDOI2017]树点涂色(LCT,dfn序,线段树,倍增LCA)
洛谷题目传送门 闲话 这是所有LCT题目中的一个异类. 之所以认为是LCT题目,是因为本题思路的瓶颈就在于如何去维护同颜色的点的集合. 只不过做着做着,感觉后来的思路(dfn序,线段树,LCA)似乎要 ...
- 洛谷P3372线段树1
难以平复鸡冻的心情,虽然可能在大佬眼里这是水题,但对蒟蒻的我来说这是个巨大的突破(谢谢我最亲爱的lp陪我写完,给我力量).网上关于线段树的题解都很玄学,包括李煜东的<算法竞赛进阶指南>中的 ...
- 洛谷P3830 随机树(SHOI2012)概率期望DP
题意:中文题,按照题目要求的二叉树生成方式,问(1)叶平均深度 (2)树平均深度 解法:这道题看完题之后完全没头绪,无奈看题解果然不是我能想到的qwq.题解参考https://blog.csdn.ne ...
- 洛谷 P3714 - [BJOI2017]树的难题(点分治)
洛谷题面传送门 咦?鸽子 tzc 竟然来补题解了?incredible( 首先看到这样类似于路径统计的问题我们可以非常自然地想到点分治.每次我们找出每个连通块的重心 \(x\) 然后以 \(x\) 为 ...
- 【洛谷P1087】FBI树
题目大意:后序遍历 题解:建立二叉树的码风不知道怎么突然跟线段树一样了...当然,这道题不建树也是可以的. 代码如下 #include <bits/stdc++.h> using name ...
随机推荐
- P5149 会议座位
P5149 会议座位 题意: 其实还是求逆序对数. 解法: 用离散化统计每个数,再用树状数组求逆序对. CODE: #include<iostream> #include<cstdi ...
- 通过蓝牙共享网络设置Charles抓包
在办公室连接WiFi时,电脑和移动设备分配到的IP地址不在同一网段, 但是Android系统提供了一个非常方便的功能,可以搭建一个网络使得这两台设备处于同一网段,实现无障碍访问,使用Charles抓包 ...
- php mvc 模式的开发注意事项
1.控制器中: 如果不涉及到数据库的就在控制器中. empty($res['code']) ? $this->error($res['msg']) : $this->success($re ...
- Wamp win10 1077error
检查日志发现了1077错误 State of services: The service 'wampapache64' is NOT started EXIT error code:1077 He ...
- CImage中m_hBitmap!=0弹框报错
见图.查资料说是图片打印出现问题. 我的代码流程主要是:读图到CImage中,然后转移到数组中,将原对象销毁,对图像内容处理后,保存. 原来没问题,在加了参数循环后报错. 考虑到是循环中一些因素初始化 ...
- kotlin之注解
注解是用来代码添加元数据的一种手段,要声明一个 注解,需要在类之前添加annotation修饰符 annotation class demo 注解其他属性,可以通过向注解类添加元注解的方式来指定 @T ...
- Eclipse的下载地址
下载地址:http://eclipse.org/
- jpa 总结
转:http://blog.csdn.net/linzhiqiang0316/article/details/52639265 先来介绍一下JPA中一些常用的查询操作: //And --- 等价于 S ...
- 一个BADI创建了两个实施会有什么问题呢?
BADI :LE_SHP_DELIVERY_PROC 创建了两个实施,会导致什么问题呢? 前台测试 调试 VL01N 进了这个断点:ZCL_IM_IM_LE_SHP_DELIV_001 F8之后 ...
- [C++/JavaScript]数据结构:栈和数列>案例引入(数制的转换)
1 案例1:数制的转换 1.1 背景与原理 1.2 编程复现 (JavaScript版 复现) function convert(value, d){ stack = []; // 栈 result ...