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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值