OpenJudge 2819:W的密码

题目描述

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;
}

猜你喜欢

转载自blog.csdn.net/armstrong_rose/article/details/80672881