Tavan–简单的k进制题
呵呵真的简单 也就是考试没做出来罢了,不慌不慌,奶我一口,还能活
【题目摘要】
题目描述
小 Zeljko 一直在阁楼里读他奶奶的旧信,并且发现了一个长度为 N 的单词。 不幸的是,由于溢出的墨水,他不知道单词的内容。他把看不清的 M 个字母每 个字母都用一个字符’#‘替换后,在一张纸上重写了这个词。他把那张纸递给 了他的奶奶,对于每个看不清的字母,奶奶给了他 K 个不同的可能。在那之后, Zeljko 在笔记本中写下了所有可能的单词,并决定仔细查看他们的属性,以确 定原始单词是什么。在看到笔记本上写下的单词后,他的奶奶意识到他们正在 寻找的是按字典序排列的第 X 个单词。Zeljko 在他们学校学习字母表的那天生 病了,所以他要求你帮助他确定原来的单词。 输入 第一行输入包含整数 N,M,K 和 X(1≤N≤500,1≤M≤N,1≤K≤26,1≤X≤ 1e9)。分别表示单词的长度,看不清的字母的数量,奶奶给出的字母的数量和 原单词是字典序的第几个。 第二行输入包含一个长度为 N 的字符串,由小写英文字母和字符’#‘组成。 表示 Zeljko 找到的单词,其中字符’#'表示看不清的字母。 接下来 M 行中的每一行包含一个长度为 K 的字符串,由 K 个不同的小写英文 字母组成。第 2+i 行的 K 个字母表示第 i 个看不清的 保证 X 总是小于等于能构造出的单词的总数。
输入格式
第一行输入包含整数 N,M,K 和 X(1≤N≤500,1≤M≤N,1≤K≤26,1≤X≤ 1e9)。分别表示单词的长度,看不清的字母的数量,奶奶给出的字母的数量和 原单词是字典序的第几个。 第二行输入包含一个长度为 N 的字符串,由小写英文字母和字符’#‘组成。 表示 Zeljko 找到的单词,其中字符’#'表示看不清的字母。 接下来 M 行中的每一行包含一个长度为 K 的字符串,由 K 个不同的小写英文 字母组成。第 2+i 行的 K 个字母表示第 i 个看不清的字母的 K 种可能。 保证 X 总是小于等于能构造出的单词的总数。
输出格式
输出一个字符串。表示原本的单词。
样例
样例输入
9 2 3 7
po#olje#i
sol
znu
样例输出
posoljeni
数据范围与提示
对于 30%的数据,M=1 并且 K=3。 对于另外 30%的数据,M=1。
数据很简单本宝宝就不再解释了
【想法+题解】
此题要解决的就是‘#’所以有脸的字母就已经失宠了不够吸引朕
初拿此题脑子里一定要有暴力的美丽身姿:而X的范围可以让你炸爽
可以暴力枚举每一种情况放进一个数组里再来个sort凤舞(我考试就是这样的)
80%的分就到手了(嘿嘿嘿)
那么怎么拿呢?
brainstorm一波:
如果我们将看不清的每一个字母的k种可能按字典序从小到大排序傻子都看得出
整个串字典序最小的就是每一个字母的第一种可能
下一个字典序就让最后一个字母移向下一个
若已经自己到达了第k种就让前一个字母移动一个自己又再次回到第一个(如此循环往复…)
这个时候这道题的真面目就渐渐显露了:
自己满k前一位就进1,完全就是k进制法则嘛
那么题目就可以变为有m个进制位,x的k进制转换,而第i个字母就取第i个进制位上的数
实在码力有限的可以瞅瞅【代码实现】
部分很奇的技巧处理学我 可以换一种方法搞
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define MAXN 505
vector < char > G[MAXN];
string s;
int n, m, k, x, cnt;
int flag[MAXN], choose[MAXN];
int main() {scanf ( "%d %d %d %d", &n, &m, &k, &x );x --;cin >> s;for ( int i = 0;i < s.length();i ++ )if ( s[i] == '#' )flag[++ cnt] = 1;for ( int i = 1;i <= m;i ++ ) {scanf ( "\n" );//以前被getchar啃过宝宝有心理阴影for ( int j = 1;j <= k;j ++ ) {char c;scanf ( "%c", &c );G[i].push_back ( c );}}for ( int i = 1;i <= m;i ++ )sort ( G[i].begin(), G[i].end() );cnt = 0;while ( x != 0 ) {choose[++ cnt] = x % k;x /= k;}cnt = 1;for ( int i = 0;i < s.length();i ++ ) {if ( s[i] == '#' ) {printf ( "%c", G[cnt][choose[m - cnt + 1]] );cnt ++;}elseprintf ( "%c", s[i] );}return 0;
}
又A一道,我们下期再见!!!