题意:原本每个字符用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;
}