题目描述
http://bailian.openjudge.cn/practice/2819
题目思路
- 字符串要循环右移
- 可利用反转来进行右移和左移
代码
#include <iostream>
#include<cstring>
using namespace std;
#define N 101
int ai[N],ai2[N],jr[N],jr2[N],sz[N],sz2[N];
void reverse(int *arr,int b,int e){
while(b<e){
char temp=arr[b];
arr[b++]=arr[e];
arr[e--]=temp;
}
}
//是反转0,n-k-1
//如果0,k-1的话就是左移k位了
void rightShift(int *arr,int n,int k){
k%=n;
reverse(arr,0,n-k-1);
reverse(arr,n-k,n-1);
reverse(arr,0,n-1);
}
int main() {
freopen("in.txt","r",stdin);
string s,copy;
int k1,k2,k3;
//a-i,j-r,s-z
while(cin>>k1>>k2>>k3&&!(k1==0&&k2==0&&k3==0)){
int index_1=0,index_2=0,index_3=0;
cin>>s;
copy=s;
for(int i=0;i<s.length();i++){
if(s[i]>='a'&&s[i]<='i'){
ai[index_1++]=i;
ai2[index_1-1]=i;
}else if(s[i]>='j'&&s[i]<='r'){
jr[index_2++]=i;
jr2[index_2-1]=i;
}else if(s[i]>='s'&&s[i]<='z'||s[i]=='_'){
sz[index_3++]=i;
sz2[index_3-1]=i;
}
}
if(index_1!=0){
rightShift(ai2,index_1,k1);
}
if(index_2!=0){
rightShift(jr2,index_2,k2);
}
if(index_3!=0){
rightShift(sz2,index_3,k3);
}
for(int i=0;i<index_1;i++){
copy[ai[i]]=s[ai2[i]];
}
for(int i=0;i<index_2;i++){
copy[jr[i]]=s[jr2[i]];
}
for(int i=0;i<index_3;i++){
copy[sz[i]]=s[sz2[i]];
}
cout<<copy<<endl;
}
fclose(stdin);
return 0;
}