[SOJ #687]双生串(2019-11-6考试)/[hdu5431]AB String
题目大意
把所有仅包含\(AB\)的字符串按字典序排列,给你一个仅包含\(AB\)的字符串\(S\),然后有\(Q\)个问题,第\(i\)个问题给你\(k_i\),求不是\(S\)的子串中,第\(k_i\)小的是什么。\(T\)组数据
\(T\leqslant5\),\(\sum|S_i|\leqslant2.3\times10^5\),\(Q_i\leqslant10\),\(k_i\leqslant10^9\)
题解
发现,长度为\(l\)的字符串有\(2^l\)个,而\(S\)的长度小于等于\(l\)的子串最多有\(l|S|\)个,可以发现,当\(l>31\)时\(2^l-l|S|>10^9\),即答案长度一定小于等于\(31\)。因为字符串中只含有\(AB\),可以用二进制表示,用\(\mathrm{hash}\)算出\(S\)中每种长度的子串。这样可以算出最终的答案的长度,然后在这一个长度中二分即可。
卡点
多测一定要清空!!
C++ Code:
#include <cstdio>
#include <iostream>
#include <algorithm>
int T, n, Q, k, p;
int s[32][250000], cnt[32];
std::string __s;
bool check(int mid, int p) {
return mid + 1 -
(std::upper_bound(s[p], s[p] + cnt[p], mid) - s[p]) >= k;
}
int main() {
std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
std::cin >> T;
while (T --> 0) {
std::cin >> __s, n = __s.length();
for (int i = 1; i <= 31 && i <= n; ++i) {
const int I = (1 << i) - 1; s[i][0] = 0;
for (int j = 0; j < i; ++j) s[i][0] = s[i][0] << 1 | __s[j] - 'A';
for (int j = i; j < n; ++j)
s[i][j - i + 1] = (s[i][j - i] << 1 | __s[j] - 'A') & I;
std::sort(s[i], s[i] + n - i + 1);
cnt[i] = std::unique(s[i], s[i] + n - i + 1) - s[i];
}
std::cin >> Q;
while (Q --> 0) {
std::cin >> k;
for (p = 1; p <= 31; ++p)
if ((1 << p) - cnt[p] < k) k -= (1 << p) - cnt[p];
else break;
int l = 0, r = (1 << p) - 1, ans = -1;
while (l <= r) {
int mid = l + r >> 1;
if (check(mid, p)) ans = mid, r = mid - 1;
else l = mid + 1;
}
for (int i = p - 1; ~i; --i) std::cout << "AB"[ans >> i & 1];
std::cout.put('\n');
}
for (int i = 1; i <= 31; ++i) cnt[i] = 0;
}
return 0;
}
[SOJ #687]双生串(2019-11-6考试)/[hdu5431]AB String的更多相关文章
- EOJ Monthly 2019.11 E. 数学题(莫比乌斯反演+杜教筛+拉格朗日插值)
传送门 题意: 统计\(k\)元组个数\((a_1,a_2,\cdots,a_n),1\leq a_i\leq n\)使得\(gcd(a_1,a_2,\cdots,a_k,n)=1\). 定义\(f( ...
- [New!!!]欢迎大佬光临本蒟蒻的博客(2019.11.27更新)
更新于2019.12.22 本蒟蒻在博客园安家啦!!! 本蒟蒻的博客园主页 为更好管理博客,本蒟蒻从今天开始,正式转入博客园. 因为一些原因,我的CSDN博客将彻底不会使用!!!(带来不便,敬请谅解) ...
- 2019.11.9 csp-s 考前模拟
2019.11.9 csp-s 考前模拟 是自闭少女lz /lb(泪奔 T1 我可能(呸,一定是唯一一个把这个题写炸了的人 题外话: 我可能是一个面向数据编程选手 作为一个唯一一个写炸T1的人,成功通 ...
- 【LOJ】#3030. 「JOISC 2019 Day1」考试
LOJ#3030. 「JOISC 2019 Day1」考试 看起来求一个奇怪图形(两条和坐标轴平行的线被切掉了一个角)内包括的点个数 too naive! 首先熟练的转化求不被这个图形包含的个数 -- ...
- Spring5最新完整教程IDEA版【通俗易懂2019.11月】
1.Maven找包: spring-webmvc spring-jdbc 2.Spring的本质是控制反转,依靠依赖注入来实现.以一个servcie对象为例,即是service暴露注入接口(构造,se ...
- LuoguP7106 双生独白 题解
Content 给定一个 十六进制颜色码(一个长度为 \(7\) 的字符串,意义详见题面),请输出其反色的十六进制颜色码. 数据范围:颜色的 R,G,B 值保证在 \(255\) 以内. Soluti ...
- 2019.11.11 洛谷月赛t3
题目背景 由于Y校的老师非常毒瘤,要求\(zhouwc\)在\(csp\)考前最后\(3\)天参加期中考,\(zhouwc\)非常生气,决定消极考试,以涂完卡但全错为目标.现在\(retcarizy\ ...
- ArchLinux 2019.11.01安装流程--安装基本系统
安装前的一些话 本文是参考官方文档ArchLinux的Installation guide(简体中文)加实际操作编写的. 有啥都好说,转载时请注明作者,这是基本素质,也是法律要求 安装是在虚拟机上进行 ...
- 6424. 【NOIP2019模拟2019.11.13】我的订书机之恋
题目描述 Description Input Output Sample Input 见下载 Sample Output 见下载 Data Constraint 题解 lj题卡线段树 求出每个右端点往 ...
随机推荐
- TP5.0整合webuploader实现多图片上传功能
在https://github.com/fex-team/webuploader 下载webuploader并解压,解压后放到public里面.其中我把解压缩后的文件夹改名为webuploader,放 ...
- Linux的DNS正向解析部署
前面介绍了DNS的作用及其相关的结果.Linux服务之DNS介绍 下面开始有关DNS的服务部署.<DNS正向解析示例> 工具:虚拟机 centos7 配置:Linux IP 192.1 ...
- vuex中mapGetters的使用及简单实现原理
一.项目中的mapGetters在Vue项目的开发过程中必然会使用到vuex,对vue项目公用数据进行管理,从而解决组件之间数据相互通信的问题,如果不使用vuex,那么一些非父子组件之间的数据通信将会 ...
- ArcGIS 10 线转点 polyline to points
核心提示,使用Construct Points工具,在编辑里,选中一条polyline,然后编辑工具栏里的Construct Points.图等有空再补上吧.
- 201671010402-陈靖 实验十四 团队项目评审&课程学习总结
项目 内容 任课教师博客主页链接 https://www.cnblogs.com/nwnu-daizh/ 作业要求链接地址 https://www.cnblogs.com/nwnu-daizh/p/1 ...
- CentOS7.5 上使用 bundle 文件安装 MySQL8.0 MySQL5.0
CentOS7.5 上使用 bundle 文件安装 MySQL8.0 MySQL5.0 CentOS7.5 环境 [root@instance-fjii60o3 ~]# rpm -qi centos- ...
- history.back(-1)和history.go(-1)的区别 (有错误)
返回一个页面方法有很多,就好比给返回按钮绑定一个URL,但是如果一个页面可以从很多页面到达,那么这个页面返回的页面就不是固定的,那么绑定固定的URL显然不妥. 两个方法的区别 既然history.ba ...
- 【Mybatis】拼接表名
- flask静态文件
Flask 静态文件 Web应用程序通常需要静态文件,例如javascript文件或支持网页显示的CSS文件.通常,配置Web服务器并为您提供这些服务,但在开发过程中,这些文件是从您的包或模块旁边的s ...
- django -- ORM查询
前戏 在我们之前操作ORM中,你也许是启动Django项目,通过地址访问固定的函数,或者在pycharm里的python console里执行,第一种比较麻烦,而且每次都要启动项目,写路由,第二种虽然 ...