POJ 1107 分组密码与流密码

主要借助了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;
}
/*

*/

猜你喜欢

转载自blog.csdn.net/qq_40679299/article/details/81046205