主要借助了p数组来储存位置
其实只需要分三类即可,如果下标对应的是第一类,就在第一类中寻找,依次类推。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<cmath>
#include<cstdlib>
#include<list>
#include<queue>
#define mm(a,b) memset(a,b,sizeof(a))
#define ACCELERATE (ios::sync_with_stdio(false),cin.tie(0))
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#define MAXN 0x3f3f3f3f3f3f3f3f
#define PI acos(-1.0)
#define E exp(1.0)
using namespace std;
//#define debug
inline void exchange(char s[100],int k,int l,char s1[100]){
for(int i=0;i<l;i++){
s1[(i+k)%l]=s[i];
}
}
int main()
{
#ifdef debug
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif // debug
int k1,k2,k3;
char ans[3][100];
char res[3][100];
char s[100];
int p[100];
while(scanf("%d%d%d",&k1,&k2,&k3)&&(k1||k2||k3)){
scanf("%s",s);
int l1=0,l2=0,l3=0;
for(int i=0;s[i];i++){
if(s[i]>='a'&&s[i]<='i'){
p[i]=0;ans[0][l1++]=s[i];
}else if(s[i]>='j'&&s[i]<='r'){
p[i]=1;ans[1][l2++]=s[i];
}else{
p[i]=2;ans[2][l3++]=s[i];
}
}
if(l1) k1%=l1;
if(l2) k2%=l2;
if(l3) k3%=l3;
exchange(ans[0],k1,l1,res[0]);
exchange(ans[1],k2,l2,res[1]);
exchange(ans[2],k3,l3,res[2]);
l1=l2=l3=0;
for(int i=0;s[i];i++){
if(p[i]==0) printf("%c",res[0][l1++]);
else if(p[i]==1) printf("%c",res[1][l2++]);
else if(p[i]==2) printf("%c",res[2][l3++]);
}
printf("\n");
}
return 0;
}
/*
*/