[EOJ Monthly2019.11][T1]纸条
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
/*
* Created by AronQi
* For personal training
* 2019/09/28
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define RG register
using namespace std;
template<class Type> inline void R(Type &x)
{
RG int c=getchar();
for(;c<48||c>57;c=getchar());
for(x=0;c>47&&c<58;x=(Type)10*x+c-48,c=getchar());
}
int N,M,K,Tag[5000001];
char Buf[5000011],Su[27];
bool Ap[27];
unsigned long long Po[5000001],X;
void Dg(int i,unsigned long long rst)
{
Tag[M-i+1]=rst/Po[i-1];
if(rst%Po[i-1]!=0LL)
{
Tag[M-i+1]++;
Dg(i-1,rst%Po[i-1]);
}
else
if(Po[i-1]!=1)
{
for(RG int j=M-i+2;j<=M;++j)
Tag[j]=K;
}
}
int main()
{
R(N);
R(M);
R(K);
R(X);
scanf("%s",Buf);
for(RG int i=1;i<=M;++i)
Tag[i]=1;
Po[0]=1;
for(RG int i=1;i<=M;++i)
{
Po[i]=Po[i-1]*(unsigned long long)K;
if(Po[i]>X)
{
Dg(i,X);
break;
}
if(Po[i]==X)
{
for(RG int j=M;j>=M-i+1;--j)
Tag[j]=K;
break;
}
}
int ind=1;
for(RG int i=0;i<N;++i)
if(Buf[i]=='#')
{
scanf("%s",Su);
for(RG int j=0;j<26;++j)
Ap[j]=0;
for(RG int j=0;j<K;++j)
Ap[Su[j]-'a']=1;
for(RG int j=0;j<26;++j)
{
if(Ap[j])--Tag[ind];
if(Tag[ind]==0)
{
Buf[i]=j+'a';
break;
}
}
++ind;
}
puts(Buf);
return 0;
}
[EOJ Monthly2019.11][T1]纸条的更多相关文章
- [EOJ Monthly2019.11][T4]安全带
以下是题干 D. 安全带 单点时限: 1.0 sec 内存限制: 256 MB (前面题干是一堆废话,我把它删了) 简单来说:初始给出一个 n 个点顺次连接而成的环,点有点权,边权是两个端点的点权乘积 ...
- eoj monthly 2019.11
原题 T1 纸条 题目大意: 给出一个长度为n的字符串,其中m位未知,对于每一位未知的字母,有k个备选字母,最终答案为备选字母按字典序排序后的第x个. 题解: 签到题-- 按照题目意思直接写就可以了. ...
- 【python基础】第11回 数据类型内置方法 02
本章内容概要 列表内置方法 字典内置方法 元组内置方法 集合内置方法 可变类型与不可变类型 本章内容详细 1.列表内置方法 list 列表在调用内置方法之后不会产生新的值 1.1 统计列表中的数据值的 ...
- NOIP2016 模拟赛
7.10 T1:求出一个矩阵中平均数大于0的子矩阵的最大面积. T2:给出一个N行的,第I行有n+1-i的倒三角形,从中选取m个数,只有当前数的左上角和右上角都被选是才能选当前数,求选的数字的最大和 ...
- NOIP 赛前模拟记录
8.11 T1 给定一个序列M,求出能过构造出的序列使得(Si+Si+1)/2=Mi成立的序列个数.保证M,S递增. T2 平面点集中最大的四边形面积 T3 不太懂得一道国家队选拔的加强版. 90+2 ...
- Python 多线程
一.线程的使用 需导入模块: from threading import Thread 二.基本使用 def fun1(arg1, v): print(arg1) print('before') t1 ...
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/skyw ...
- 如何对于几百行SQL语句进行优化?
1.最近在开发中遇到的一些关于几百行SQL语句做查询的问题,需要如何的解决优化SQL这确实是个问题,对于当下的ORM 框架 EF 以及其他的一些的开源的框架例如Drapper ,以及Sqlite-Su ...
- Java之线程,常用方法,线程同步,死锁
1, 线程的概念 进程与线程 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据 ...
随机推荐
- Android新版xUtils3工具类相关debug
首先出现问题是 build.gradle中的csayısıom.lidroid.xutils:xutils:2.6.13报错了,所以想到是版本的问题,github上搜了xutils发现有新版xutil ...
- ASP.NET配置KindEditor文本编辑器
文本编辑器:CKEditor和CKFinder KindEditor 1.KindEditor KindEditor 是一套开源的在线HTML编辑器,主要用于让用户在网站上获得所见即所得编辑效果,开 ...
- 关于CSRF 和 csrftoken
CSRF 虽然利用了session验证机制的漏洞,一般使用加密token的方式防御,但是其本身和session以及JWT token没有直接联系. 描述 CSRF利用用户正常登录产生的cookie,利 ...
- Spark在美团是怎么实现的
目录 1. 美团离线计算平台架构都有哪些框架? 2. 为什么要使用Spark架构? 3. spark推广过程中需要注意哪些方面? 前言 美团是数据驱动的互联网服务,用户每天在美团上的点击.浏览.下单支 ...
- groovy程序设计
/********* * groovy中Object类型存在隐式转换 可以不必使用as强转 */ Object munber = 9.343444 def number1 = 2 println mu ...
- JQ向上取整 和向下取整 四舍五入
向上取整 var a = 23.2325236 var abc = Math.ceil(a); //注意:Math.ceil(a)不要单独写一行,否则向上取整失败 abc = 24; ...
- Hyperledger Fabric(3)通道与组织
1,通道的结构 通道是Fabric中非常重要的概念(类似微信群?),它实质是由排序节点划分和管理的私有原子广播通道,目的是对通道的信息进行隔离,使得通道外的实体无法访问通道内的信息,从而实现交易的隐私 ...
- 小米Air 13.3 安装Arch Linux
0. 前言 最近新买了一台小米Air 13.3,除了但键盘手感外都比较满意.我比较喜欢折腾Linux,但又不想放弃原有的Windows 10 Home,于是在原有的windows 10基础上再安装了A ...
- PAT Basic 1014 福尔摩斯的约会 (20 分)
大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm.大侦探很快就明白了,字条上奇 ...
- 03-spring框架—— AOP 面向切面编程
3.1 动态代理 动态代理是指,程序在整个运行过程中根本就不存在目标类的代理类,目标对象的代理对象只是由代理生成工具(不是真实定义的类)在程序运行时由 JVM 根据反射等机制动态生成的.代理对象与目标 ...