AcWing 427. Jam的计数法
原题链接
中等
作者:
Value
,
2020-09-08 17:10:58
,
所有人可见
,
阅读 460
#include <iostream>
#include <unordered_map>
using namespace std;
int l, r, n;
unordered_map<char, bool> mp; // 记录字母是否出现
bool next_string(string &s){
for(int i = s.size() - 1; i >= 0; i -- ){
if(s[i] != 'a' + r - 1 && !mp[s[i] + 1]){
if(s[i] + 1 - 'a' + 1 + n - 1 - i > r) return false;
// 每次替换掉一个字母以后,字符串后面的序列都要重排(与r比较看是否存在下一个字符串)
mp[s[i]] = false;
s[i] += 1;
mp[s[i]] = true;
int k = i + 1;
// s[i]后面的字母一次替换为s[i] + 1, s[i] + 2 ...
while(k < n){
mp[s[k]] = false;
s[k] = s[i] + (k - i);
mp[s[k]] = true;
k ++ ;
}
cout << s << endl;
return true;
}
}
return false;
}
int main(){
cin >> l >> r >> n;
string s; cin >> s;
for(int i = 0; i < s.size(); i ++ ) mp[s[i]] = true;
for(int i = 0; i < 5; i ++ ){
if(!next_string(s)) break;
}
return 0;
}