https://vjudge.net/problem/175274/origin
把每个字符的ansicc码变成二进制链接起来,然后再每隔6个当成一个数字,索引查找一个表对应的字符,如果最后不够6个。补够0
需要稍加处理,① 如果最后剩1个字符,那么最后那12个组成的2个字符不取,补上 ‘=’
② 如果最后剩12个,最后6个组成的字符不取。
这样搞k次,问你最后的结果。
错了两次。
第一次是因为不太清楚string。
这样string的长度仍然是输入的长度。。
方法有两个改进,① 用+号,最后取长度就行。
② 把string 用resize一下,那么resize一个非常大的数,那么就和char数组没有啥区别了。。
③ 直接用char数组把。。
顺便记一下。这是某个大佬弄的,在很多很多运算的时候,string的apend比+ 号略快。 其他情况下用 加号就行。
#include <bits/stdc++.h>
using namespace std;
string ss="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
vector<int>q;
string s;
int kk[10];
int main()
{ int t,cs;
q.clear();
scanf("%d",&t);
int cas=1;
while(t--){
q.clear();
cin>>cs;
//s.resize(2000000);
//getchar();
cin>>s;
//cout<<s<<endl;
//cout<<s.length()<<endl;
q.clear();
int xr=s.length();
int loc=0;
for(int ii=1;ii<=cs;ii++){
q.clear();
for(int i=0;i<xr;i++){
int num=s[i];
memset(kk,0,sizeof(kk));
int bj=0;
//cout<<num<<"**"<<endl;
for(int j=0;j<8;j++){
kk[bj++]=num%2;
num/=2;
}
reverse(kk,kk+bj);
for(int j=0;j<bj;j++)
q.push_back(kk[j]);
}
int flag1=-1;
if(q.size()%24==8)
flag1=1;
if(q.size()%24==16)
flag1=2;
while(q.size()%24){
q.push_back(0);
}
int tim=q.size()/6;
if(flag1==1) tim-=2;
else if(flag1==2) tim-=1;
loc=0;
xr=0;
s.clear();
for(int i=0;i<tim;i++){
int qz=(int)pow(2,5);
int ans=0;
for(int j=loc;j<6+loc;j++){
if(q[j])
ans+=q[j]*qz;
qz/=2;
}
loc+=6;
s+=ss[ans%64];
}
//cout<<xr<<"??"<<endl;
if(flag1==1) s+="==";
if(flag1==2) s+="=";
xr=s.length();
//cout<<xr<<endl;
if(ii==cs){
printf("Case #%d: ",cas++);
for(int j=0;j<xr;j++){
cout<<s[j];
}
cout<<endl;
break;
}
}
}
return 0;
}