王道《机试指南》2024 清华炉灰老师解法
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void Partition(string str,vector<int> &vec1,vector<int> &vec2,vector<int> &vec3){
int i;
for(i = 0; i < str.size(); ++i){
if(str[i] >= 'a' && str[i] <= 'i'){
vec1.push_back(i);
}else if(str[i] >= 'j' && str[i] <= 'r'){
vec2.push_back(i);
}else{
vec3.push_back(i);
}
}
}
//右旋
void RightRotate(string &str, vector<int> &vec, int offset){
vector<char> tmp;
if (vec.size() != 0 && offset > vec.size()) {
offset = offset % vec.size();
}
for(int i = vec.size() - offset; i < vec.size(); ++i){
tmp.push_back(str[vec[i]]);
}
for(int i = vec.size() - offset - 1; i >= 0; --i){
str[vec[i+ offset]] = str[vec[i]];
}
for(int i = 0; i < tmp.size(); ++i){
str[vec[i]] = tmp[i];
}
}
int main() {
// string str = "_icuo_bfnwhoq_kxert";
// int k1 = 2, k2 = 3, k3 = 1;
string str;
int k1,k2,k3;
while(cin >> k1 >> k2 >> k3){
if(k1==0 && k2==0 && k3==0) break;
cin >> str;
vector<int> vec1, vec2, vec3;
Partition(str,vec1,vec2,vec3);
RightRotate(str,vec1,k1);
RightRotate(str,vec2,k2);
RightRotate(str,vec3,k3);
cout << str << endl;
}
return 0;
}