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. Ubuntu的Mysql指南

    安装MySQL sudo apt-get install mysql-server 这个应该很简单了,而且我觉得大家在安装方面也没什么太大问题,所以也就不多说了,下面我们来讲讲配置. 配置MySQL ...

  2. 多线程进行http请求

    昨天需要一个线下脚本进行单播推送,大约有1kw个用户,考虑到推送速度就临时搞了个请求线上的一个脚本 /** * 临时支持invoke单播推送 */ #include <stdio.h> # ...

  3. PAT 1009. 说反话 (20)

    给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串.字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区 ...

  4. HTML5商城开发一 楼层滚动加载数据

    对于楼层加载在以前只是个想法,从来没实现过,刚好项目中碰到,再此总结一下 场景:HTML5,局部商品列表信息滚动(局部滚动条) 1.通过jq设置subCategoryScroll的高度为屏幕显示高度( ...

  5. netcore web.config ConnectionStrings AppSettings

    new ConfigurationBuilder().Build().GetSection("ConnectionStrings") new ConfigurationBuilde ...

  6. FastReport 隐藏matrix的列如何实现

    fastReport在处理 行列都是浮动的时候非常好用. 但是也有一些不太直观的东西.比如说要设置生成结果的某行某列. 修改字体颜色背景色,隐藏,设置行高,设置列宽等等. 可以在 matrix的aft ...

  7. mybatis 3.2.8 + log4j2.0.2 控制台输出sql语句

    mybatis3.2.7有一个bug,使用log4j2 (2.0.2)版本时,会找不到类 ,导致启动失败,详见 https://github.com/mybatis/mybatis-3/issues/ ...

  8. C语言复习(1)

    test.c #include <stdio.h> int main(){ printf("hello\n"); return 0; } 1.预处理阶段 由于在test ...

  9. Use Dapper ORM With ASP.NET Core

    Dapper.NET is not just another ORM tool, it's considered as the king of ORM. Because it's fast, easy ...

  10. c8051f320学习,单片机不外乎时钟、IO、串口、USB等外设用法

      时钟 IO(输入.输出,如何配置) IO   数字和模拟资源可以通过25个I/O 引脚(C805 1F3 2 0 ),每个端口引脚都可以被定义为 通用I/O(GPIO)或 0 模拟输入 所有端口I ...