[SOJ #538]好数 [CC]FAVNUM(2019-8-6考试)
题目大意:给定$n$个正整数,求$[l,r]$中第$k$小的”好数“。$l,r\leqslant10^{18},n\leqslant62$,出现的其他数均$\leqslant10^{50}$
好数定义为它至少包含这$n$个数中的一个
题解:二分答案,数位$DP$+$AC$自动机上$DP$,求一个数是第几个好数可以见[文本生成器](https://www.cnblogs.com/Memory-of-winter/p/11305126.html)
卡点:无
C++ Code:
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <queue>
const int maxn = 20 * 1000; long long n, k, l, r;
long long f[20][maxn];
namespace AC {
int nxt[maxn][10], fail[maxn], idx = 1;
bool End[maxn];
void insert(std::string s) {
int p = 1;
for (char ch : s) {
if (nxt[p][ch & 15]) p = nxt[p][ch &15];
else p = nxt[p][ch & 15] = ++idx;
}
End[p] = true;
}
void build() {
std::queue<int> q;
for (int i = 0; i < 10; ++i)
if (nxt[1][i]) fail[nxt[1][i]] = 1, q.push(nxt[1][i]);
else nxt[1][i] = 1;
while (!q.empty()) {
int u = q.front(); q.pop();
for (int i = 0; i < 10; ++i)
if (nxt[u][i]) {
fail[nxt[u][i]] = nxt[fail[u]][i];
End[nxt[u][i]] |= End[fail[nxt[u][i]]];
q.push(nxt[u][i]);
} else nxt[u][i] = nxt[fail[u]][i];
}
} int num[20], tot;
long long calc(int x, int lim, int lead, int p) {
if (!x) return lead;
long long F = f[x][p];
if (~F && !lim && lead) return F;
F = 0;
for (int i = lim ? num[x] : 9, up = 1; ~i; --i, up = 0)
if (!End[nxt[p][i]])
F += calc(x - 1, lim && up, lead || i, nxt[p][i]);
if (~F && !lim && lead) f[x][p] = F;
return F;
}
long long solve(long long x) {
if (!x) return 0;
long long X = x;
tot = 0;
while (x) num[++tot] = x % 10, x /= 10;
return X - calc(tot, 1, 0, 1);
}
long long query(long long k, long long L, long long R) {
long long base = solve(L - 1), l = L, r = R, ans = L;
while (l <= r) {
long long mid = l + r >> 1, t = solve(mid) - base;
if (t >= k) r = mid - 1, ans = mid;
else l = mid + 1;
}
if (solve(ans) - base != k) return -1;
return ans;
}
} int main() {
std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
memset(f, -1, sizeof f);
std::cin >> l >> r >> k >> n;
for (int i = 0; i < n; ++i) {
static std::string s;
std::cin >> s;
AC::insert(s);
}
AC::build();
std::cout << AC::query(k, l, r) << '\n';
return 0;
}
[SOJ #538]好数 [CC]FAVNUM(2019-8-6考试)的更多相关文章
- 【LOJ】#3030. 「JOISC 2019 Day1」考试
LOJ#3030. 「JOISC 2019 Day1」考试 看起来求一个奇怪图形(两条和坐标轴平行的线被切掉了一个角)内包括的点个数 too naive! 首先熟练的转化求不被这个图形包含的个数 -- ...
- 工具软件集合 Adobe AE PS Pr CC 2018 2019 破解教程
来源https://mp.weixin.qq.com/s/zeq1sTmaPsKt7Bsok0Ldrg(若链接失效,请关注软件安装管家公众号) 相关链接 Office 2019破解教程 Adobe 2 ...
- 2019.3.28&2019.3.30考试
2019.3.28 : 肥肠爆芡,因为这场考试的题太屑了,所以我咕咕了 Upd on 2019.3.30 压进来一篇(因为都没啥意义) 2019.3.30 : 全机房读错题+没有大样例=T2全体爆炸 ...
- 2019.3.18考试&2019.3.19考试&2019.3.21考试
2019.3.18 C O D E T1 树上直接贪心,环上for一遍贪心 哇说的简单,码了将近一下午终于码出来了 感觉自己码力/写题策略太糟糕了,先是搞了一个细节太多的写法最后不得不弃疗了,然后第二 ...
- 2019.4.1考试&2019.4.2考试&2019.4.4考试
4.1:T1原题,T2码农板子题,T3板子题 4.2 好像是三个出题人分别出的 以及#define *** 傻逼 T1 思维好题 转成树形DP,$dp[i][j]$表示点i值为j的方案数,记录前缀和转 ...
- 2019.3.12考试&2019.3.13考试&ESTR
过程:太菜了,不写了 T1 基环树直径,一定学 T2 树上斜率优化,类似购票,数据结构/分治算法,一定改 (把点按深度排序倒着跑2e7次斜率优化也能A,orz zyz) T3 CC原题,码码码,一定补 ...
- 2019.2.28&2019.3.1 考试
因为没A/改几道题,就一起写了 题目在LOJ上都能找到 2019.2.28 100+20+12 前两个小时一直在睡觉+想题也没思路,我太菜了 T1 洗衣服 分开处理出洗衣服和烘干的时间,然后一边正着排 ...
- 2019.2.26考试T2 矩阵快速幂加速DP
\(\color{#0066ff}{题解 }\) 可以发现, 数据范围中的n特别小,容易想到状压 可以想到类似于状压DP的思路,按列进行转移 那么应该有3维,\(f[i][j][k]\)代表到第i列, ...
- 2019.2.14 考试T3 交互题
\(\color{#0066ff}{ 题目描述 }\) 由于机房被成功拯救了,花_Q很高兴,花_Q生成了一个 0 到 N - 1 的排列(排列的下标从 0 到 N - 1 ).保证排列中 0 在 N ...
随机推荐
- 「HNOI2016」序列
传送门 Description 有 \(q\) 个询问,每个询问给定两个数\(l\) 和\(r\),求 \(a[l:r]\) 的不同子序列的最小值之和 Solution 校内模拟赛用了这道题,但是莫 ...
- Scala函数柯里化(Currying or Curry)
柯里化(Currying) 把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术. 简单的实现如下: scala> def ...
- 【Django】Django项目结构与单元测试
学校的软工项目要开发一个网站,自然的想到用python+Django来做.由于之前没有用Django开发过大型的网站项目,所以遇到了一些问题.记录在此,便于以后查阅. 今天完成了项目结构的设计.部分的 ...
- Servlet快速入门及运行流程
一.Servlet快速入门 1.创建一个web工程 2.在JavaResource中src下创建一个包名称为com.myxq.servlet 3.在创建的servlet包当中创建一个class文件起名 ...
- Spark2.x(五十七):User capacity has reached its maximum limit(用户容量已达到最大限制)
背景: 目前服务器资源是43个节点,每个节点配置信息如下:24VCores 64G yarn配置情况: yarn.scheduler.minimum-allocation-mb 单个容器可申请的最小 ...
- 秒杀功能压测 jmeter--------重要!!!
线程组里面有三个接口请求,依次为:显示商品列表.登录秒杀平台账户.进行秒杀 对线程组用5000个线程循环10次 设置一下默认配置,之后就不用反复填写了 设置配置文件这个具体功能就是读text文件并且设 ...
- oracle远程连接服务器
一.需要下载的工具 1.PLSQL Developer 下载及安装地址如下: http://www.zdfans.com/html/18196.html 2.下载instantclient-basic ...
- k8s 新加节点
拷贝原来的内容过去,删除 cd /opt/kubernetes/ssl/ 1. 删除 kubelet-crt key kube-proxy-key.pem 相关的这些key是,根据too ...
- Python3 多线程(连接池)操作MySQL插入数据
1.主要模块DBUtils : 允许在多线程应用和数据库之间连接的模块套件Threading : 提供多线程功能 2.创建连接池PooledDB 基本参数: mincached : 最少的空闲连接数, ...
- 编写vscode插件
一.参考学习 https://www.cnblogs.com/liuxianan/p/vscode-plugin-publish.html https://code.visualstudio.com/ ...