分析:显然是一道数位dp题,不过需要一些奇怪的姿势.常规的数位dp能统计出一个区间内满足条件的数的个数,可是我们要求第k个,怎么办呢?转化为经典的二分问题,我们二分当前数的大小,看它是第几大的,就可以了.

显然数位dp套上模板,再用上kmp的next数组就可以了,传递4个参数:还剩下多少位没有匹配,匹配了多少位,是否达到上限和是否匹配成功,到最后判断一下就可以了.

学到了一种很强的思想:如果能求出i是第几个数,要求出第k个数就可以二分i的值.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;long long L, R, K, f[20][2010][2];
int m, nextt[40], a[30];
char X[100];void init()
{nextt[0] = 0;nextt[1] = 0;for (int i = 1; i < m; i++){int j = nextt[i];while (j && X[i] != X[j])j = nextt[j];nextt[i + 1] = X[i] == X[j] ? j + 1 : 0;}
}long long dfs(int len, int w, bool limit, bool flag)
{if (len == 0)return flag;if (!limit && f[len][w][flag] != -1)return f[len][w][flag];int maxn = limit ? a[len] : 9;long long cnt = 0;for (int i = 0; i <= maxn; i++){int t = w;while (t && X[t] - '0' != i)t = nextt[t];if (X[t] - '0' == i)t++;cnt += dfs(len - 1, t, limit && (i == a[len]), flag || (t == m));}return limit ? cnt : f[len][w][flag] = cnt;
}long long query(long long u)
{int cnt = 0;while (u){a[++cnt] = u % 10;u /= 10;}memset(f, -1, sizeof(f));return dfs(cnt, 0, 1, 0);
}int main()
{scanf("%lld %lld %s %lld", &L, &R, X, &K);m = strlen(X);init();if (query(R) < K + query(L - 1)){printf("Hey,wake up!\n");return 0;}long long t = query(L - 1),ans = L;long long l = L, r = R;while (l < r){long long mid = (l + r) >> 1;if (query(mid) - t >= K){r = mid;ans = mid;}elsel = mid + 1;}printf("%lld\n", r);return 0;
}

转载于:https://www.cnblogs.com/zbtrs/p/7633376.html

清北学堂模拟赛d6t3 反击数相关推荐

  1. 清北学堂模拟赛d5t4 套路

    分析:题目非常短,看起来非常难,其实把图一画就明白了.有向图,每个点的出度都是1,那么整个图肯定是环上套链,链上的边无论怎样反向都不会形成环,环上的边也可以随便反向,但是最终不能反为同向的,总方案数减 ...

  2. 清北学堂模拟赛d3t2 b

    分析:一道比较让人头疼的数学题. 先考虑怎么让分出来的三角形相似,先不考虑每个三角形的具体边长,设每个三角形的周长为li,则可知必然有一个数g = gcd{li},每一个三角形的周长都是g的倍数,这样 ...

  3. 清北学堂模拟赛d2t4 最大值(max)

    题目描述 LYK有一本书,上面有很多有趣的OI问题.今天LYK看到了这么一道题目: 这里有一个长度为n的正整数数列ai(下标为1~n).并且有一个参数k. 你需要找两个正整数x,y,使得x+k< ...

  4. 清北学堂模拟赛d1t1 位运算1(bit)

    题目描述 LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥有的价值.例如数字123拥有6的价值,数字999拥有27的价值. 假设数字N的价值是K,LYK想找到 ...

  5. 清北学堂模拟赛day7 错排问题

    /* 考虑一下已经放回m本书的情况,已经有书的格子不要管他,考虑没有书的格子,不考虑错排有(n-m)!种,在逐步考虑有放回原来位置的情况,已经放出去和已经被占好的格子,不用考虑,剩下全都考虑,设t=x ...

  6. 清北学堂模拟赛d6t4 数组异或

    分析:直接O(n^3)做是只有50分的,可以加一点小小的优化,就是c[k]可以从c[k-1]得到,但是还是只有60分,从宏观意义上是不能继续优化了.对于这类涉及到位运算的性质的题目,将每个数转化成二进 ...

  7. 清北学堂模拟赛d6t2 刀塔

    分析:看到最小值最大就很显然是二分了吧,二分一下最小值,把小于它的数给删掉,然后看每个数向左边能延伸多长,往右边能延伸多长,最后统计一下有没有可行答案就可以了. #include <cstdio ...

  8. 清北学堂模拟赛d3t6 c

    分析:比较神奇的一道题.要把树变成环肯定要先变成链,然后把链给拼接成环.接下来考虑一个脑洞大开的树形dp:设f[i][0]表示i不与父节点相连的链数,f[i][1]表示i与父节点相连的链数,先考虑怎么 ...

  9. 2020清北学堂秋季营感想——Hoarfrost

    2020清北学堂秋季营感想 前言:九月三十日放假以后,就马不停蹄地开始了这一次的奥赛培训.原先参加过暑假的提高组腾飞营,当时第一场模拟赛拿了第一,便觉得CSP的题目难度不会很高,普及+/提高-左右的难 ...

最新文章

  1. 多个DIV排列时居中
  2. OpenCASCADE:Modeling Data之几何实用程序
  3. 从头开始敲代码之《从BaseApplication/Activity开始》
  4. 操作系统之(一篇文章让你简单搞定:什么是进程和线程)
  5. java 是否继续_Java异常被抛出或被捕获之后,代码是否继续执行的问题
  6. 小白打基础一定要吃透的11类 Python 内置函数
  7. MAC 打开safari和Chrome打开开发者工具的快捷键
  8. spring boot 用dbcp2连接数据库出现(Access denied for user 'root'@'localhost' (using password: YES)) 异常
  9. 大学微积分考试能用计算机吗,AP微积分考试需要什么样的计算器?
  10. 计算机四级数据库教程,全国计算机等级考试四级教程—数据库工程师[借鉴].pdf...
  11. atapi.sys 蓝屏 难度系数☆☆☆ ...
  12. 程序员眼中的中国传统文化_王阳明《传习录》2
  13. python编程知识大全_python编程入门之二:必备基础知识
  14. 若依前后端分离版+vue图片上传
  15. 如何进行系统的架构设计?
  16. 新手必看!如何在windows下安装Python(Python入门教程)
  17. 3添加、修改、删除数据(oracle数据库)
  18. 2018款Y7000升级硬盘+迁移、升级黑苹果
  19. 《乱音盒子》之《闪耀的星》
  20. tomcat系列-04-启用APR

热门文章

  1. 58 Openstack基础、openstack之glance、openstack之keystone
  2. php 获取http headers
  3. DPM2010恢复整个邮箱数据库
  4. Visual Studio 2010 Ultimate开发与测试敏捷特性
  5. 基于便签纸的无限延生学习方法
  6. future career plan
  7. mac上面启用托盘放大效果的方法
  8. 自已编写C# DLL 绑定到unity进程进行单步调试
  9. 随手记:IDAPro蛮强大
  10. prepare 和 row_count()一起使用的误区