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树的更多相关文章

  1. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

  2. 洛谷P3018 [USACO11MAR]树装饰Tree Decoration

    洛谷P3018 [USACO11MAR]树装饰Tree Decoration树形DP 因为要求最小,我们就贪心地用每个子树中的最小cost来支付就行了 #include <bits/stdc++ ...

  3. 洛谷:P1087 FBI树 P1030 求先序排列 P1305 新二叉树

    至于为啥把这三个题放到一起,大概是因为洛谷的试炼场吧,三道树的水题,首先要理解 先序中序后序遍历方法. fbi树由于数量小,在递归每个区间时,暴力跑一遍区间里的数,看看是否有0和1.至于递归的方法,二 ...

  4. NOIP2017提高组Day2T3 列队 洛谷P3960 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/9265380.html 题目传送门 - 洛谷P3960 题目传送门 - LOJ#2319 题目传送门 - Vij ...

  5. 洛谷P3703 [SDOI2017]树点涂色(LCT,dfn序,线段树,倍增LCA)

    洛谷题目传送门 闲话 这是所有LCT题目中的一个异类. 之所以认为是LCT题目,是因为本题思路的瓶颈就在于如何去维护同颜色的点的集合. 只不过做着做着,感觉后来的思路(dfn序,线段树,LCA)似乎要 ...

  6. 洛谷P3372线段树1

    难以平复鸡冻的心情,虽然可能在大佬眼里这是水题,但对蒟蒻的我来说这是个巨大的突破(谢谢我最亲爱的lp陪我写完,给我力量).网上关于线段树的题解都很玄学,包括李煜东的<算法竞赛进阶指南>中的 ...

  7. 洛谷P3830 随机树(SHOI2012)概率期望DP

    题意:中文题,按照题目要求的二叉树生成方式,问(1)叶平均深度 (2)树平均深度 解法:这道题看完题之后完全没头绪,无奈看题解果然不是我能想到的qwq.题解参考https://blog.csdn.ne ...

  8. 洛谷 P3714 - [BJOI2017]树的难题(点分治)

    洛谷题面传送门 咦?鸽子 tzc 竟然来补题解了?incredible( 首先看到这样类似于路径统计的问题我们可以非常自然地想到点分治.每次我们找出每个连通块的重心 \(x\) 然后以 \(x\) 为 ...

  9. 【洛谷P1087】FBI树

    题目大意:后序遍历 题解:建立二叉树的码风不知道怎么突然跟线段树一样了...当然,这道题不建树也是可以的. 代码如下 #include <bits/stdc++.h> using name ...

随机推荐

  1. 图论——最小生成树:Prim算法及优化、Kruskal算法,及时间复杂度比较

    最小生成树: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.简单来说就是有且仅有n个点n-1条边的连通图. 而最小生成树就是最小权 ...

  2. richtextbox Ctrl+V只粘贴纯文本格式

    只能粘贴剪切板中的TXT内容 并且 不能改变 剪切板的内容1 当用户按下Ctrl+V屏蔽系统的粘贴功能,然后添加自己的功能2019年12月19日 19:34:38 private void richT ...

  3. Ubuntu系统图形化界面无法登录到root用户的解决方法

    Ubuntu默认是禁用了root用户的登录. 系统安装后, 图形化界面无法登录到root用户解决方法:Ubuntu 12.04:1.设置root用户密码:  普通用户登录,sudo passwd ro ...

  4. 课下选做作业实现mypwd

    2019-2020-1 20175227 <信息安全系统设计基础> 课下选做作业实现mypwd 要求 学习pwd命令 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 ...

  5. Linux设备驱动程序 之 中断和锁

    中断和锁 1. 硬中断和软中断(包括tasklet和timer)共享数据,硬中断中使用spin_lock/spin_unlock,软中断中使用spin_lock_irq/spin_unlock_irq ...

  6. windows把zookeeper注册成服务

    1.官网下载zookeeper:http://mirrors.hust.edu.cn/apache/zookeeper/. 2.修改zookeeper下面的文件/zookeeper/conf/zoo_ ...

  7. UML期末复习题——2.9:UML Deployment Diagram

    附加题:部署图 重要概念: 1. 部署图 部署图表示的是,如何将具体的软件制品(例如可执行文件)分配到计算节点(具有处理服务的某种事物)上.部署图表示了软件元素在物理架构上的部署,以及物理元素之间的通 ...

  8. C之结构体

    #include<stdio.h> #include<stdlib.h> void study(){ printf("好好学习,天天向上 \n"); } / ...

  9. RegexBuddy 4.7.0 x64 评估试用到期,无限试用的办法

    http://www.cnblogs.com/inrg/p/6491043.html 最后对比发现,在注册表 HKEY_USERS 节点下存在一个用户的项,形如 "S-1-5-21-1609 ...

  10. Bash Shellshock(CVE-2014-6271)破壳漏洞测试

    0x01 漏洞原理 Bash使用的环境变量是通过函数名称来调用的,导致漏洞出问题是以"(){"开头定义的环境变量在命令ENV中解析成函数后,Bash执行并未退出,而是继续解析并执行 ...