发布时间:2025-11-04 07:24:44 来源:码上建站 作者:人工智能

原题:AcWing 3805. 环形数组[1]
给定一个长度为 的道简单题代码的地由小写字母构成的字符串 。
请你构造一个长度为 的总C自己由小写字母构成的字符串 。
要求,风格方字符串 需满足:
字符串 在字典序上大于字符串 。优于 字符串 的道简单题代码的地字母集是字符串 的字母集的子集。一个字符串的总C自己字母集是指该字符串包含的所有不同字母的集合,例如 abadaba 的风格方字母集为 。云南idc服务商 字符串 在字典序上尽可能小。优于保证答案存在。道简单题代码的地
第一行包含整数 ,总C自己表示共有 组测试数据。风格方
每组数据第一行包含两个整数 和 。优于
第二行包含一个长度为 的道简单题代码的地字符串表示 。
每组数据输出一行满足所有条件的总C自己字符串 。
思路:分情况讨论
当 k 大于 n 时,前 n 位不变,b2b信息网我们让 n 位开始填补出现过的最小字符就行 当 k 小于等于 n 时,我们从原字符串 k - 1 位开始往前找,如果当前字符还有变小的可能,那么就让其变小,寻找停止,输出新字符串可以看出我的代码思路很清晰,但是写得有一点冗余。
看看 y 总的代码。
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 100010; int n, k; char s1[N], s2[N]; bool st[26]; char get_min() { for (int i = 0; i < 26; i ++ ) if (st[i]) return i + a; return -1; } char get_next(int t) { for (int i = t + 1; i < 26; i ++ ) if (st[i]) return i + a; return -1; } int main() { int T; scanf("%d", &T); while (T -- ) { scanf("%d%d", &n, &k); scanf("%s", s1); memset(st, 0, sizeof st); for (int i = 0; i < n; i ++ ) st[s1[i] - a] = true; if (k > n) { printf("%s", s1); char c = get_min(); for (int i = n; i < k; i ++ ) printf("%c", c); puts(""); } else { s2[k] = 0; for (int i = k - 1; i >= 0; i -- ) { char c = get_next(s1[i] - a); if (c != -1) { s2[i] = c; for (int j = 0; j < i; j ++ ) s2[j] = s1[j]; break; } s2[i] = get_min(); } puts(s2); } } return 0; } // 作者:yxc // 链接:https://www.acwing.com/activity/content/code/content/1634481/ // 来源:AcWing // 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。很简洁。
[1]AcWing 3805. 环形数组:
https://www.acwing.com/activity/content/problem/content/5457/