https://acm.ecnu.edu.cn/ 华东师范大学在线评测网站

今天这个题目来自华东师范大学的校赛,比icpc稍难一些,在2019年11月29日周五19:30开始,持续2.5个小时

以下是题干

A. 纸条

单点时限: 2.0 sec,内存限制: 256 MB

“欢迎您乘坐东方航空公司航班 MU5692 由银川前往上海......”

“我们的飞机很快就要起飞了,请收起小桌板,摘下耳机......”

收起了小桌板,摘下了耳机,Cuber QQ 突然无所事事了。

放耳机进书包的时候,Cuber QQ 无意带出了一些小纸条。是以前的回忆。

纸条在书包中已经存在了不知道多久。水渍泛黄了纸张,有些字他不能认出来。

具体来说,信件是一个包含 N 个字母的单词。其中有 M 个难以辨认的字母,用字符 # 代替。

Cuber QQ 用残存的回忆给对每个难以辨认的字母都给出了 K 个不同的候选字母。

为了方便比较哪个更接近于自己的回忆,Cuber QQ 在纸上列出了所有可能的单词。

在看过这些单词以后,Cuber QQ 认为按照字典序排名,第 X 个单词就是原来的单词。

你能知道 Cuber QQ 以前写了什么吗?

输入格式

第一行整数 N,M,K 和 X (1≤N≤500000,1≤M≤N,1≤K≤26,1≤X≤1018) 。

第二行长度为 N 的单词,包含小写字母和 # 。

接下来 M 行,每行包括 K 个字母,表示第 i 个难以辨认的字母可能由这些字母代替。

保证 X 不超过能构造的单词数量。

输出格式

一行一个字符串,表示答案。

样例输入

5 2 3 4

c##nb

std

lws

样例输出

cslnb

Solution

看到这道题首先模拟一下样例,就大概知道该怎么做了

求这样M个空位,每个空位有K种可能的,希望得出按字典序排列的第X种,相当于求X用K的次幂表示。这就把这道题目抽象成了一个数学问题

\(X=a_M*K^M+a_{M-1}*K^{M-1}+...+a_{2}*K^2+a_{1}*K+a_0\)

用递归解决就可以了

要注意的点是小心预处理,前面一部分填1,也就是在每个空位内选第一个可能字符,后面一部分填M

  1. /*
  2. * Created by AronQi
  3. * For personal training
  4. * 2019/09/28
  5. */
  6. #include <cstdio>
  7. #include <cstdlib>
  8. #include <cstring>
  9. #include <iostream>
  10. #include <algorithm>
  11. #define RG register
  12. using namespace std;
  13. template<class Type> inline void R(Type &x)
  14. {
  15. RG int c=getchar();
  16. for(;c<48||c>57;c=getchar());
  17. for(x=0;c>47&&c<58;x=(Type)10*x+c-48,c=getchar());
  18. }
  19. int N,M,K,Tag[5000001];
  20. char Buf[5000011],Su[27];
  21. bool Ap[27];
  22. unsigned long long Po[5000001],X;
  23. void Dg(int i,unsigned long long rst)
  24. {
  25. Tag[M-i+1]=rst/Po[i-1];
  26. if(rst%Po[i-1]!=0LL)
  27. {
  28. Tag[M-i+1]++;
  29. Dg(i-1,rst%Po[i-1]);
  30. }
  31. else
  32. if(Po[i-1]!=1)
  33. {
  34. for(RG int j=M-i+2;j<=M;++j)
  35. Tag[j]=K;
  36. }
  37. }
  38. int main()
  39. {
  40. R(N);
  41. R(M);
  42. R(K);
  43. R(X);
  44. scanf("%s",Buf);
  45. for(RG int i=1;i<=M;++i)
  46. Tag[i]=1;
  47. Po[0]=1;
  48. for(RG int i=1;i<=M;++i)
  49. {
  50. Po[i]=Po[i-1]*(unsigned long long)K;
  51. if(Po[i]>X)
  52. {
  53. Dg(i,X);
  54. break;
  55. }
  56. if(Po[i]==X)
  57. {
  58. for(RG int j=M;j>=M-i+1;--j)
  59. Tag[j]=K;
  60. break;
  61. }
  62. }
  63. int ind=1;
  64. for(RG int i=0;i<N;++i)
  65. if(Buf[i]=='#')
  66. {
  67. scanf("%s",Su);
  68. for(RG int j=0;j<26;++j)
  69. Ap[j]=0;
  70. for(RG int j=0;j<K;++j)
  71. Ap[Su[j]-'a']=1;
  72. for(RG int j=0;j<26;++j)
  73. {
  74. if(Ap[j])--Tag[ind];
  75. if(Tag[ind]==0)
  76. {
  77. Buf[i]=j+'a';
  78. break;
  79. }
  80. }
  81. ++ind;
  82. }
  83. puts(Buf);
  84. return 0;
  85. }

[EOJ Monthly2019.11][T1]纸条的更多相关文章

  1. [EOJ Monthly2019.11][T4]安全带

    以下是题干 D. 安全带 单点时限: 1.0 sec 内存限制: 256 MB (前面题干是一堆废话,我把它删了) 简单来说:初始给出一个 n 个点顺次连接而成的环,点有点权,边权是两个端点的点权乘积 ...

  2. eoj monthly 2019.11

    原题 T1 纸条 题目大意: 给出一个长度为n的字符串,其中m位未知,对于每一位未知的字母,有k个备选字母,最终答案为备选字母按字典序排序后的第x个. 题解: 签到题-- 按照题目意思直接写就可以了. ...

  3. 【python基础】第11回 数据类型内置方法 02

    本章内容概要 列表内置方法 字典内置方法 元组内置方法 集合内置方法 可变类型与不可变类型 本章内容详细 1.列表内置方法 list 列表在调用内置方法之后不会产生新的值 1.1 统计列表中的数据值的 ...

  4. NOIP2016 模拟赛

    7.10 T1:求出一个矩阵中平均数大于0的子矩阵的最大面积. T2:给出一个N行的,第I行有n+1-i的倒三角形,从中选取m个数,只有当前数的左上角和右上角都被选是才能选当前数,求选的数字的最大和 ...

  5. NOIP 赛前模拟记录

    8.11 T1 给定一个序列M,求出能过构造出的序列使得(Si+Si+1)/2=Mi成立的序列个数.保证M,S递增. T2 平面点集中最大的四边形面积 T3 不太懂得一道国家队选拔的加强版. 90+2 ...

  6. Python 多线程

    一.线程的使用 需导入模块: from threading import Thread 二.基本使用 def fun1(arg1, v): print(arg1) print('before') t1 ...

  7. Java多线程系列--“基础篇”10之 线程优先级和守护线程

    概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/skyw ...

  8. 如何对于几百行SQL语句进行优化?

    1.最近在开发中遇到的一些关于几百行SQL语句做查询的问题,需要如何的解决优化SQL这确实是个问题,对于当下的ORM 框架 EF 以及其他的一些的开源的框架例如Drapper ,以及Sqlite-Su ...

  9. Java之线程,常用方法,线程同步,死锁

    1, 线程的概念 进程与线程 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据 ...

随机推荐

  1. JS实现把一个页面层数据传递到另一个页面的两种方式

    本博客整理了两种方式从一个页面层向另一个页面层传递参数. 一. 通过cookie方式 1. 传递cookie页面的html,此处命名为a.html 请输入用户名和密码: <input id=&q ...

  2. SpringBoot中使用Websocket进行消息推送

    WebsocketConfig.java @Configuration public class WebSocketConfig { @Bean public ServerEndpointExport ...

  3. uboot 主Makefile 分析。

    本文以uboot_1.1.6 对应的CPU是S3C2440 为例 uboot_1.1.6 根目录下的主Makefile开头: VERSION = PATCHLEVEL = SUBLEVEL = EXT ...

  4. expdp使用

    原文:https://blog.csdn.net/zftang/article/details/6387325 ORACLE EXPDP命令使用详细相关参数以及导出示例: 1. DIRECTORY指定 ...

  5. Dubbo架构

    原文链接http://dubbo.apache.org 架构图 节点角色说明 节点 角色说明 Provider 暴露服务的服务提供方 Consumer 调用远程服务的服务消费方 Registry 服务 ...

  6. Spring的基本应用(1):IDEA版本

    一.Spring概述: 1.什么是Spring? Spring是分层的JavaSE/EE应用full-stack(一站式)轻量级开源框架,以IoC(Inverse Of Control:控制反转)和A ...

  7. Shell随机生成字符串

    随机生成18位的字符串,数字 大小写字符 斜线 password=`openssl rand -base64 |-`

  8. window.prompt()和 window.confirm()选择

    代码截图: 效果:  代码截图: 效果:

  9. JS异步上传文件

    直接调用Upload(option)方法,即可上传文件,不需要额外的插件辅助,采用原生js编写. /* *异步上传文件 *option参数 **url:上传路径 **data:上传的其他数据{id:& ...

  10. 锋利的jQuery读书随笔

    代码规范:var $variable = jQuery对象:var variable = DOM对象: jQuery对象无法使用DOM对象的任何方法,同样DOM对象也无法使用jQuery对象的任何方法 ...