AtCoder Beginner Contest 416 C 题
题目连接
题意: 给定 NNN 个字符串, 存在 NKN^KNK 个整数序列. 按照所有的整数序列将字符串拼接, 然后按照字典序升序排列, 求第 XXX 个字符串.
数据范围: 1≤N≤10;1≤K≤5;1≤X≤NK1 \leq N \leq 10; 1 \leq K \leq 5; 1\leq X \leq N^K1≤N≤10;1≤K≤5;1≤X≤NK
题解: 全排列的时间复杂度为 O(NK)O(N^K)O(NK) , 排序的时间复杂度为 O(NK∗logNk)O(N^K * log{N^k})O(NK∗logNk). 直接暴力.
const int N = 1e5 + 5;
vector<int> path; // 记录排列
int n, k, x;
vector<vector<int>> res(N); // 存储所有的排列
int cnt;// 对于 [1, n] 之间的所有数, 所有的整数序列
// 形参 d 表示, 当前递归到哪一位上.
void dfs(int d) {if (d == k) { // 如果已经递归到第 k 位上, 表示当前的排列长度为 k. 跳出递归.for (int e : path) { // 记录排列res[cnt].emplace_back(e);}cnt++;return;}for (int i = 1; i <= n; ++i) { // 遍历所有整数path.push_back(i);dfs(d + 1);path.pop_back(); // 上一层递归结束之后, 恢复现场, 删除上一层添加的元素}
}void slove()
{cin >> n >> k >> x;vector<string> a(n + 5);for (int i = 0; i < n; i++) cin >> a[i];int len = pow(n, k);vector<string> b(len);int sz = 0;dfs(0);// 将所有的整数序列所代表的字符串拼接for (int i = 0; i < cnt; i++) {string s;for (auto e : res[i]) {s += a[e - 1];}b[sz++] = s;}// 排序即可得到字典序升序sort(b.begin(), b.begin() + sz);cout << b[x - 1] << endl;
}