WC结束了,来补一下这题的题解

首先感谢SC神犇YYY(第一个AC此题的神犇)教我做法

再感谢教YYY做法的Claris大爷

首先,我们发现一个性质,一个合法的数的后缀必定是合法的,所以我们就可以bfs了,往合法的数的最高位加0或1

只有最高位是1的数才有可能是答案

YYY大爷告诉我们,并且不难证明任何时候队列中以0开头的数字数量小于等于以1开头的数字数量,并且每次进入合法节点最多只会生成一个不合法数字,因此整个搜索是O(n*处理每个节点的时间)的

对于队列里的每个数,记录3个东西,十进制下的hash值,十进制长度len,二进制后len位

同时维护当前10^len的二进制,由于是BFS,所以len只增不减

最后有一个问题,队列里的元素不是有序的。这也很好办,对于相同长度的序列,只需要先全部加0,再全部加1

具体细节可以看我的代码

窝的代码是目前为止AC代码中最短的

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#define ll long long
#define N 23333
#define L 170
#define P 1000000009 using namespace std;
inline void multiply(int *a,int b){
int k=0;
for (int i=1;i<=a[0];++i){
a[i]=a[i]*b+k;
k=a[i]>>1;
a[i]=a[i]&1;
}
for (;a[0]<165&&k;k=k>>1) a[++a[0]]=k&1;
} inline void add(int *a,const int *b){
a[0]=max(a[0],b[0]);
int k=0;
for (int i=1;i<=a[0];++i){
a[i]+=b[i]+k;
k=a[i]>>1;
a[i]=a[i]&1;
}
for (;a[0]<165&&k;k=k>>1) a[++a[0]]=k&1;
} inline int gethash(int *a,int len){
int ret=0;
for (int i=1;i<=len;++i)
ret=((ll)ret*233%P+a[i])%P;
return ret;
} void print(int *a,int len){
for (int i=len;i;--i) printf("%d",a[i]);
puts("");
} struct node{
int hash,len;
int b[L];
};
node q[N];int qh,qt,lastqh,lastqt;
int rank;
int t[L]; int main(){
scanf("%d",&rank);--rank;
if (!rank){puts("1");return 0;}
lastqh=qh=0;lastqt=qt=2;
q[1].len=1;q[1].hash=0;
q[1].b[0]=1;q[1].b[1]=0;
q[2].len=1;q[2].hash=1;
q[2].b[0]=1;q[2].b[1]=1;
t[0]=1;t[1]=1;
for (;;lastqh=qh,lastqt=qt){
multiply(t,10);
for (int k=0;k<2;++k){
qh=lastqh;
while (qh<lastqt){
q[++qt]=q[++qh];
++q[qt].len;
q[qt].hash=((ll)q[qt].hash*233%P+k)%P;
if (k) add(q[qt].b,t);
if (q[qt].hash!=gethash(q[qt].b,q[qt].len)) --qt;
else if (k) --rank;
if (!rank){
print(q[qt].b,q[qt].len);
return 0;
}
}
}
}
return 0;
}

  

bzoj4404: [Neerc2015]Binary vs Decimal的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. Write a program to convert decimal to 32-bit unsigned binary.

    Write a program to convert decimal to 32-bit unsigned binary. Write a program to convert a 32-bit un ...

  3. General Decimal Arithmetic 浮点算法

    General Decimal Arithmetic http://speleotrove.com/decimal/ General Decimal Arithmetic [ FAQ | Decima ...

  4. 数据库设计(2/9):域,约束和默认值(Domains, Constraints and Defaults)

    对于设计和创建数据库完全是个新手?没关系,Joe Celko, 世界上读者数量最多的SQL作者之一,会告诉你这些基础.和往常一样,即使是最专业的数据库老手,也会给他们带来惊喜.Joe是DMBS杂志是多 ...

  5. ASM:《X86汇编语言-从实模式到保护模式》第9章:实模式下中断机制和实时时钟

    中断是处理器一个非常重要的工作机制.第9章是讲中断在实模式下如何工作,第17章是讲中断在保护模式下如何工作. ★PART1:外部硬件中断 外部硬件中断是通过两个信号线引入处理器内部的,这两条线分别叫N ...

  6. 【代码】二进制转BCD [转]

    BCD:Binary Coded Decimal 即用4位二进制编码表示1位的十进制数.   定义:BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行. ...

  7. python ide ---wing 注册机

    注册机脚本代码如下: import sha import string BASE2 = '01' BASE10 = '0123456789' BASE16 = '0123456789ABCDEF' B ...

  8. 初步认识Hive

    初步认识Hive hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行.其优点是学习 ...

  9. 配置ogg异构oracle-mysql(1)基础环境配置

    一.环境描述: 192.168.0.164 ( Oracle ) —> 192.168.0.165 (Mysql ) 版本: 操作系统:redhat5.8 Oracle:  11.2.0.3 M ...

随机推荐

  1. linux安装jdk 不成功,找不到版本问题

    http://www.linuxidc.com/Linux/2015-01/112030.htm 配置文件 export JAVA_HOMEexport JRE_HOMEexport CLASSPAT ...

  2. win10显示此电脑

    http://jingyan.baidu.com/article/3aed632e00dfe17011809169.html

  3. Linux shell循环

    条件测试 格式 test condition 或 [ condition ] 使用方括号时,要注意在条件两边加上空格,如果有操作符,运算符之间也必须有空格 测试状态:测试的结果可以用$?的值来判断,0 ...

  4. 清北学堂2017NOIP冬令营入学测试P4747 D’s problem(d)

    时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题 描述 题目描述 小D是一名魔法师,它最喜欢干的事就是对批判记者了. 这次记者招待会上,记者对 ...

  5. 分享我对领域驱动设计(DDD)的学习成果

    本文内容提要: 1. 领域驱动设计之领域模型 2. 为什么建立一个领域模型是重要的 3. 领域通用语言(Ubiquitous Language) 4.将领域模型转换为代码实现的最佳实践 5. 领域建模 ...

  6. 牛X的CSS3

    See the Pen Dot Wave by Rich Howell (@roborich) on CodePen

  7. Java7并发编程实战(一) 线程的等待

    试想一个情景,有两个线程同时工作,还有主线程,一个线程负责初始化网络,一个线程负责初始化资源,然后需要两个线程都执行完毕后,才能执行主线程 首先创建一个初始化资源的线程 public class Da ...

  8. FPGA中的INOUT接口和高阻态

    除了输入输出端口,FPGA中还有另一种端口叫做inout端口.如果需要进行全双工通信,是需要两条信道的,也就是说需要使用两个FPGA管脚和外部器件连接.但是,有时候半双工通信就能满足我们的要求,理论上 ...

  9. 用canvas画简单的“我的世界”人物头像

    前言:花了4天半终于看完了<Head First HTML5>,这本书的学习给我最大的感受就是,自己知识的浅薄,还有非常多非常棒的技术在等着我呢.[熊本表情]扶朕起来,朕还能学! H5新增 ...

  10. 用Dart&Henson玩转Activity跳转

    用Dart&Henson玩转Activity跳转 Extra是Android标准的组件之间(Activity/Fragment/Service等)传递数据的方式.本文介绍了开源项目Dart的使 ...