这道水题在上次月赛(2019.11)出现过(~~但架不住我是个菜鸡呀~~),今天不想去洛谷了来换换口味,竟然又遇到了它,算是有缘叭,毕竟当时没做出来,后来也没改。
题意要求字典序,所以首先要把每一个 ‘#‘ 按字母表排序。然后这个经过思考,可以发现求相应的字母这个问题等价于「求一个十进制数的 m 位 k 进制表示」(~~所以就是一道进制转换Orz~~)。
出题人没有开高数度,应该是放水了。
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, m, k;
unsigned long long x;
string text;
cin >> n >> m >> k >> x >> text;
vector<string> dict(m);
for (int i = 0; i < m; ++i) {
cin >> dict[i];
sort(dict[i].begin(), dict[i].end());
}
vector<char> index(m);
--x; // 注意 x 给的是「第几个」数,所以实际上的数字是 x - 1。
for (auto i = index.rbegin(); i != index.rend(); ++i) {
*i = x % k;
x /= k;
}
for (int i = 0, cnt = 0; cnt < m; ++i) {
if (text[i] == '#') {
text[i] = dict[cnt][index[cnt]];
++cnt;
}
}
cout << text << '\n';
}
另外这 Markdown 怎么鬼畜了,我的删除线被吃了
才发现我没有
#include <string>
,我发现了什么?这说明string
可能已经被什么别的文件包含了。