HDU5237 加密K次 3*8变成 4*6

题意:原本每个字符用8位二进制数表示 现在每三个字符 把它的24位分成4个字符 有分别的对应方法。
每次都把原文当8位的 然后进行加密
如果多出来一个8位 需要补4个0 如果多出来两个8位 需要补2个0
还有一点就是 如果加密后的字符数不是4的倍数 需要用=号补到4的倍数
大模拟:
ac代码如下:

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
#define sd(a) scanf("%d",&a)
#define sdd(a,b) scanf("%d%d",&a,&b)
#define cl(a,b) memset(a,b,sizeof(a))
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define sddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define dbg() printf("aaa\n")
using namespace std;
const int maxn=5050;
char code[100];
void init(){
    rep(i,0,25) code[i]='A'+i;
    rep(i,26,51) code[i]='a'+i-26;
    rep(i,52,61) code[i]='0'+i-52;
    code[62]='+',code[63]='/';
}
char s[maxn];//原串
int num[maxn];//01串存此
inline int getid(int i){
    int now=0;
    int p=0;
    for(int j=i+5;j>=i;j--){
        if(num[j]){
            now+=(1<<p);
        }
        p++;
    }
    return now;
}
void fun(char *s){
    cl(num,0);
    int len=strlen(s+1);//以及保证每次都是3的倍数了!!!
    int k=0;//多少位
    rep(i,1,len){
        for(int j=7;j>=0;j--){
            num[++k]=((s[i]&(1<<j))?1:0);
        }
    }//现在变成了01串
    //现在把01串变成新的64位串
    int dig=k/24;//新的一共多少个 4字符
    int mod=k%24;
    int cnt=0;//记录新串到哪了
    int i;
    for(i=1;;i+=6){
        s[++cnt]=code[getid(i)];
        if(cnt==dig*4) break;
    }
    if(mod==8){
        i+=6;
        s[++cnt]=code[getid(i)];
        i+=6;
        s[++cnt]=code[getid(i)];
    }else if(mod==16){
        i+=6;
        s[++cnt]=code[getid(i)];
        i+=6;
        s[++cnt]=code[getid(i)];
        i+=6;
        s[++cnt]=code[getid(i)];
    }
    int left=cnt%4;
    while(left!=0&&left<4){
        s[++cnt]='=';
        left++;
    }
    s[++cnt]='\0';
    return;
}
int main() {
	init();
    int T;
    sd(T);
    rep(cas,1,T){
        int k;sd(k);
        scanf("%s",s+1);
        while(k--){
            fun(s);
        }
        printf("Case #%d: %s\n",cas,s+1);
    }
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值