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

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

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

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. long long L, R, K, f[][][];
  9. int m, nextt[], a[];
  10. char X[];
  11.  
  12. void init()
  13. {
  14. nextt[] = ;
  15. nextt[] = ;
  16. for (int i = ; i < m; i++)
  17. {
  18. int j = nextt[i];
  19. while (j && X[i] != X[j])
  20. j = nextt[j];
  21. nextt[i + ] = X[i] == X[j] ? j + : ;
  22. }
  23. }
  24.  
  25. long long dfs(int len, int w, bool limit, bool flag)
  26. {
  27. if (len == )
  28. return flag;
  29. if (!limit && f[len][w][flag] != -)
  30. return f[len][w][flag];
  31. int maxn = limit ? a[len] : ;
  32. long long cnt = ;
  33. for (int i = ; i <= maxn; i++)
  34. {
  35. int t = w;
  36. while (t && X[t] - '' != i)
  37. t = nextt[t];
  38. if (X[t] - '' == i)
  39. t++;
  40. cnt += dfs(len - , t, limit && (i == a[len]), flag || (t == m));
  41. }
  42. return limit ? cnt : f[len][w][flag] = cnt;
  43. }
  44.  
  45. long long query(long long u)
  46. {
  47. int cnt = ;
  48. while (u)
  49. {
  50. a[++cnt] = u % ;
  51. u /= ;
  52. }
  53. memset(f, -, sizeof(f));
  54. return dfs(cnt, , , );
  55. }
  56.  
  57. int main()
  58. {
  59. scanf("%lld %lld %s %lld", &L, &R, X, &K);
  60. m = strlen(X);
  61. init();
  62. if (query(R) < K + query(L - ))
  63. {
  64. printf("Hey,wake up!\n");
  65. return ;
  66. }
  67. long long t = query(L - ),ans = L;
  68. long long l = L, r = R;
  69. while (l < r)
  70. {
  71. long long mid = (l + r) >> ;
  72. if (query(mid) - t >= K)
  73. {
  74. r = mid;
  75. ans = mid;
  76. }
  77. else
  78. l = mid + ;
  79. }
  80. printf("%lld\n", r);
  81.  
  82. return ;
  83. }

清北学堂模拟赛d6t3 反击数的更多相关文章

  1. 清北学堂模拟赛day7 数字碰撞

    /* clj:水题别人都满分你不是你就完了,所以说水题一定要细心一点,有这么几个细节:①前导零的处理,全是零的时候要特判②换行要注意,不要多大一行,剩下就是水水的模拟了 */ #include< ...

  2. 清北学堂模拟赛d4t1 a

    分析:大模拟,没什么好说的.我在考场上犯了一个超级低级的错误:while (scanf("%s",s + 1)),导致了死循环,血的教训啊,以后要记住了. /* 1.没有发生改变, ...

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

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

  4. 清北学堂模拟赛day7 石子合并加强版

    /* 注意到合并三堆需要枚举两个端点,其实可以开一个数组记录合并两堆的结果,标程好像用了一个神奇的优化 */ #include<iostream> #include<cstdio&g ...

  5. 清北学堂模拟赛d6t6 棋盘迷宫

    3.棋盘迷宫(boardgame.pas/c/cpp)(boardgame.in/out)时间限制:5s/空间限制:256M[题目描述]小 A 和小 Z 是非常要好的朋友, 而且他们都对迷宫游戏非常有 ...

  6. 清北学堂模拟赛d1t2 火柴棒 (stick)

    题目描述众所周知的是,火柴棒可以拼成各种各样的数字.具体可以看下图: 通过2根火柴棒可以拼出数字“1”,通过5根火柴棒可以拼出数字“2”,以此类推. 现在LYK拥有k根火柴棒,它想将这k根火柴棒恰好用 ...

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

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

  8. 清北学堂模拟赛d2t6 分糖果(candy)

    题目描述总共有n颗糖果,有3个小朋友分别叫做L,Y,K.每个小朋友想拿到至少k颗糖果,但这三个小朋友有一个共同的特点:对3反感.也就是说,如果某个小朋友拿到3颗,13颗,31颗,333颗这样数量的糖果 ...

  9. 清北学堂模拟赛d2t5 吃东西(eat)

    题目描述一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间a1 ...

随机推荐

  1. geronimo

    时间限制 1s 空间限制 512MB 3.1 题目描述 "Geronimo∼" 时间还很多,让我们慢慢来. 不如听首开心的歌再看题?-- 算了,直接看题吧. 给定一个整数 n,以及 ...

  2. HDU3487 Play with Chain splay 区间反转

    HDU3487 splay最核心的功能是将平衡树中的节点旋转到他的某个祖先的位置,并且维持平衡树的性质不变. 两个操作(数组实现) cut l,r, c把[l,r]剪下来放到剩下序列中第c个后面的位置 ...

  3. 创建APP检查更新页

    本文来源及参考:Create a check for updates page for your app. 这篇文章解释了如何创建一个简单的检查更新页,检查该用户已安装的应用程序的最新版本. 简介 这 ...

  4. 如何在vue项目中引入阿里巴巴的iconfont图库

    1. 打开 http://www.iconfont.cn/ 2. 选择我们喜欢的图标,点击上面的小车,加入图标库,即右侧的购物车 3.点击购物车,点击下载代码 4.解压下载的文件夹,将文件夹复制到 a ...

  5. JAVA基础(多线程Thread和Runnable的使用区别(转载)

    转自:http://jinguo.iteye.com/blog/286772 Runnable是Thread的接口,在大多数情况下“推荐用接口的方式”生成线程,因为接口可以实现多继承,况且Runnab ...

  6. vue中时间控件绑定多个输入框

    首先去下载laydate时间控件,引入到相应的模板中 <input type="text" val-required="" value="&qu ...

  7. github fork项目更改后与原作者同步更新

    1.进入你的GitHub发起Pull request 2.选择compare across forks 3.反向操作.base fork改为自己的,head fork改为原作者的 4.点击 creat ...

  8. printf的实型

    参  数 说  明 %f 按实数格式输出,整数部分按实际位数输出,6位小数 %m.nf 总位数m(含小数点),其中有n位小数 %-m.nf 同上,左对齐 %0.xf 输出小数点后x位   %f 后面如 ...

  9. ACM_水题你信吗

    水题你信吗 Time Limit: 2000/1000ms (Java/Others) Problem Description: 某发最近又认识了很多妹(han)子,可是妹(han)子一多不免有时会忘 ...

  10. 【转】Java 集合系列09之 Map架构

    概要 前面,我们已经系统的对List进行了学习.接下来,我们先学习Map,然后再学习Set:因为Set的实现类都是基于Map来实现的(如,HashSet是通过HashMap实现的,TreeSet是通过 ...