算法1
对每组字符相对位置右移n位
等价于
将他们所在下标左移n位
C++ 代码
#include <iostream>
#include <string>
#include <vector>
using std::cout;
using std::cin;
using std::endl;
using std::vector;
using std::string;
void shl(vector<int>& init, vector<int>& res, int n){
int len = init.size();
for(int i = 0; i <len; i++){
res.push_back(init[(i+n)%len]);
}
}
int main()
{
int k[3];
cin >> k[0] >> k[1] >> k[2];
while(k[0] || k[1] || k[2]){
string str;
cin >> str;
vector<int> init_group1;
vector<int> init_group2;
vector<int> init_group3;
vector<int> res_group1;
vector<int> res_group2;
vector<int> res_group3;
for(int i = 0; i < str.length(); i++){
if(str[i] >= 'a' && str[i] <= 'i')
init_group1.push_back(i);
else if(str[i] >= 'j' && str[i] <= 'r')
init_group2.push_back(i);
else
init_group3.push_back(i);
}
shl(init_group1,res_group1,k[0]);
shl(init_group2,res_group2,k[1]);
shl(init_group3,res_group3,k[2]);
string tmp(str);
for(int i = 0; i < init_group1.size(); i++){
str[res_group1[i]] = tmp[init_group1[i]];
}
for(int i = 0; i < init_group2.size(); i++){
str[res_group2[i]] = tmp[init_group2[i]];
}
for(int i = 0; i < init_group3.size(); i++){
str[res_group3[i]] = tmp[init_group3[i]];
}
cout << str << endl;
cin >> k[0] >> k[1] >> k[2];
}
return 0;
}