#include using namespace std; int main() { int a, b, n; // 最小字母,最大字母,字符串的长度 string s; // 输入的字符串是什么 cin >> a >> b >> n >> s; a--, b--; // 题目中下标从1开始,为了方便我们修改为从0开始,所以 a--,b-- for (int i = 0; i < 5; i++) { // 最多输出5个 int k = n - 1; /* 从后向前枚举,这是因为如果一个jam数字,比如bcdef,可以先从最后下手变成 bcdeg,这样变化最小 如果后面实在变化不了了,才能变化前一位。 判断 (1) 可用字母数量:(s[k]+1-'a')~b (2) k~n-1 : 当前位置后面的空位(空位的数量n-k) (3) 如果可用的字母数量可以填充满,就是找到了一个数字,否则k这个位置上长大一个的目标就是无法达成的,只能是继续向前找 */ while (k >= 0 && b - (s[k] - 'a') < n - k) k--; // 如果不行,就继续向前 if (k < 0) break; // 如果每一位都无法变大,说明是最大排列,已经无路可走 // 否则可以变大,变成比现在大的最小的一个,把当前位及后面都调大一位即可 for (int j = k, c = s[k] + 1; j < n; j++, c++) s[j] = c; cout << s << endl; } return 0; }