原题:AcWing 3805. 环形数组[1] 给定一个长度为 的道简单题代码的地由小写字母构成的字符串 。 请你构造一个长度为 的总C自己由小写字母构成的字符串 。 要求,风格方字符串 需满足: 保证答案存在。道简单题代码的地 第一行包含整数 ,总C自己表示共有 组测试数据。风格方 每组数据第一行包含两个整数 和 。优于 第二行包含一个长度为 的道简单题代码的地字符串表示 。 每组数据输出一行满足所有条件的总C自己字符串 。 思路:分情况讨论 可以看出我的代码思路很清晰,但是写得有一点冗余。 看看 y 总的代码。 很简洁。 [1]AcWing 3805. 环形数组: https://www.acwing.com/activity/content/problem/content/5457/题目
输入格式
输出格式
数据范围
前三个测试点满足 。风格方 所有测试点满足 ,。 同一测试点内,所有 的和不超过 ,所有 的和不超过 。 输入样例:
4 3 3 abc 3 2 abc 3 3 ayy 2 3 ba 输出样例:
aca ac yaa baa 代码
#include <iostream> #include <cstring> #include <algorithm> using namespace std; int n, k; bool used[26]; string s, t; string tail() { int i = 0; for (; i < 26; ++ i) if (used[i]) break; char a = a + i; string res(k - n, a); return res; } string get() { char max_char; for (int i = 25; i >= 0; -- i) { if (used[i]) { max_char = a + i; break; } } char min_char; for (int i = 0; i < 26; ++ i) { if (used[i]) { min_char = a + i; break; } } int i = k - 1; for (; i >= 0; -- i) { if (s[i] != max_char) break; } string res1 = s.substr(0, i); string res2; for (int j = s[i] - a + 1; j < 26; ++ j) { if (used[j]) { res2 = (char) a + j; break; } } string res3(k - i - 1, min_char); return res1 + res2 + res3; } int main() { int T; cin >> T; while (T --) { cin >> n >> k; cin >> s; memset(used, 0, sizeof used); for (int i = 0; i < s.size(); ++ i) used[s[i] - a] = true; if (k > n) { t = s + tail(); } else { t = get(); } cout << t << endl; } } y 总代码
经验:
char s[]; puts(s); 中, puts 遇到 \0 注意是 char s[k] = 0 而不是 char s[k] = 0 字符串停止输出。云服务器提供商参考资料