HDU 5237-Base64(模拟-K轮加密)
来源:互联网 发布:淘宝商家服务 编辑:程序博客网 时间:2024/06/05 10:26
Base64
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1242 Accepted Submission(s): 556
Problem Description
Mike does not want others to view his messages, so he find a encode method Base64.
Here is an example of the note in Chinese Passport.
The Ministry of Foreign Affairs of the People's Republic of China requests all civil and military authorities of foreign countries to allow the bearer of this passport to pass freely and afford assistance in case of need.
When encoded by \texttt{Base64}, it looks as follows
VGhlIE1pbmlzdHJ5IG9mIEZvcmVpZ24gQWZmYWlycyBvZiB0aGUgUGVvcGxlJ3MgUmVwdWJsaWMgb2Yg
Q2hpbmEgcmVxdWVzdHMgYWxsIGNpdmlsIGFuZCBtaWxpdGFyeSBhdXRob3JpdGllcyBvZiBmb3JlaWdu
IGNvdW50cmllcyB0byBhbGxvdyB0aGUgYmVhcmVyIG9mIHRoaXMgcGFzc3BvcnQgdG8gcGFzcyBmcmVl
bHkgYW5kIGFmZm9yZCBhc3Npc3RhbmNlIGluIGNhc2Ugb2YgbmVlZC4=
In the above text, the encoded result of \texttt{The} is \texttt{VGhl}. Encoded in ASCII, the characters \texttt{T}, \texttt{h}, and \texttt{e} are stored as the bytes84 , 104 , and 101 , which are the 8 -bit binary values 01010100 , 01101000 , and 01100101 . These three values are joined together into a 24-bit string, producing 010101000110100001100101 .
Groups of6 bits (6 bits have a maximum of 26=64 different binary values) are converted into individual numbers from left to right (in this case, there are four numbers in a 24-bit string), which are then converted into their corresponding Base64 encoded characters. The Base64 index table is
0123456789012345678901234567890123456789012345678901234567890123
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
In the above example, the string010101000110100001100101 is divided into four parts 010101 , 000110 , 100001 and 100101 , and converted into integers 21,6,33 and 37 . Then we find them in the table, and get V, G, h, l.
When the number of bytes to encode is not divisible by three (that is, if there are only one or two bytes of input for the last 24-bit block), then the following action is performed:
Add extra bytes with value zero so there are three bytes, and perform the conversion to base64. If there was only one significant input byte, only the first two base64 digits are picked (12 bits), and if there were two significant input bytes, the first three base64 digits are picked (18 bits). '=' characters are added to make the last block contain four base64 characters.
As a result, when the last group contains one bytes, the four least significant bits of the final 6-bit block are set to zero; and when the last group contains two bytes, the two least significant bits of the final 6-bit block are set to zero.
For example, base64(A) = QQ==, base64(AA) = QUE=.
Now, Mike want you to help him encode a string fork times. Can you help him?
For example, when we encode A for two times, we will get base64(base64(A)) = UVE9PQ==.
Here is an example of the note in Chinese Passport.
The Ministry of Foreign Affairs of the People's Republic of China requests all civil and military authorities of foreign countries to allow the bearer of this passport to pass freely and afford assistance in case of need.
When encoded by \texttt{Base64}, it looks as follows
VGhlIE1pbmlzdHJ5IG9mIEZvcmVpZ24gQWZmYWlycyBvZiB0aGUgUGVvcGxlJ3MgUmVwdWJsaWMgb2Yg
Q2hpbmEgcmVxdWVzdHMgYWxsIGNpdmlsIGFuZCBtaWxpdGFyeSBhdXRob3JpdGllcyBvZiBmb3JlaWdu
IGNvdW50cmllcyB0byBhbGxvdyB0aGUgYmVhcmVyIG9mIHRoaXMgcGFzc3BvcnQgdG8gcGFzcyBmcmVl
bHkgYW5kIGFmZm9yZCBhc3Npc3RhbmNlIGluIGNhc2Ugb2YgbmVlZC4=
In the above text, the encoded result of \texttt{The} is \texttt{VGhl}. Encoded in ASCII, the characters \texttt{T}, \texttt{h}, and \texttt{e} are stored as the bytes
Groups of
0123456789012345678901234567890123456789012345678901234567890123
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
In the above example, the string
When the number of bytes to encode is not divisible by three (that is, if there are only one or two bytes of input for the last 24-bit block), then the following action is performed:
Add extra bytes with value zero so there are three bytes, and perform the conversion to base64. If there was only one significant input byte, only the first two base64 digits are picked (12 bits), and if there were two significant input bytes, the first three base64 digits are picked (18 bits). '=' characters are added to make the last block contain four base64 characters.
As a result, when the last group contains one bytes, the four least significant bits of the final 6-bit block are set to zero; and when the last group contains two bytes, the two least significant bits of the final 6-bit block are set to zero.
For example, base64(A) = QQ==, base64(AA) = QUE=.
Now, Mike want you to help him encode a string for
For example, when we encode A for two times, we will get base64(base64(A)) = UVE9PQ==.
Input
The first line contains an integer T (T≤20 ) denoting the number of test cases.
In the followingT lines, each line contains a case. In each case, there is a number k(1≤k≤5) and a string s . s only contains characters whose ASCII value are from 33 to 126 (all visible characters). The length of s is no larger than 100 .
In the following
Output
For each test case, output Case #t:, to represent this is t-th case. And then output the encoded string.
Sample Input
21 Mike4 Mike
Sample Output
Case #1: TWlrZQ==Case #2: Vmtaa2MyTnNjRkpRVkRBOQ==
Source
The 2015 ACM-ICPC China Shanghai Metropolitan Programming Contest
题目意思:
T组测试数据,每组K轮加密S字符串。
先根据每个字符的ASCII码转换成八位二进制,然后分割成六位二进制码转换回ASCII,如果末尾不足六位需要补零,如果当前轮加密后的字符串长度不是四的倍数,需要在末尾补‘#’。
解题思路:
模拟…注意处理好细节就好啦~
#include <iostream>#include <cstdio>#include <cstring>#include <bitset>#include <map>#include <iomanip>#include <algorithm>#define MAXN 100000#define INF 0xfffffffusing namespace std;char c[MAXN];int a[MAXN];string str[MAXN];char ans[MAXN];char b[MAXN];char f[65]= {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j', 'k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/' };//加密规则void solve(char c[]){ memset(a,'\0',sizeof(a));//存储ASCII码 memset(b,'\0',sizeof(b));//存储二进制串 memset(ans,'\0',sizeof(ans)); int len=strlen(c); int cnt=0,cans=0; for(int i=0; i<len; ++i) { a[i]=int(c[i]); bitset<8>s(a[i]);//转换成八位二进制串 string c=s.to_string<char,char_traits<char>,allocator<char> >(); for(int j=0; j<8; ++j) b[cnt++]=c[j]; } int l=0,r=0,lenb; if(cnt%6!=0) l=cnt,r=((cnt/6)+1)*6;//计算需要末尾补零时 bool bl=false;//标志是否进行补零操作 if(r!=0&&l!=0) { bl=true; for(int i=l; i<r; ++i) b[i]='0';//补零 lenb=r;//更新b数组长度 } else lenb=cnt; l=0,r=0; for(int i=0; i<cnt; ++i) { if(i!=0&&(i+1)%6==0)//每六位一组计算 { r=i;//当前六位数组的起始下标 char ch[10]; int cn=0; for(int j=l; j<=r; ++j) ch[cn++]=b[j]; string str2(ch); bitset<6> bs2(str2);//将六位二进制数转换成ASCII码 int res=bs2.to_ulong(); ans[cans++]=f[res]; l=i+1;//当前六位数组的结束下标 } } if(bl)//计算补零后最后六位 { char ch[10]= {'\0'}; int cn=0; for(int i=l; i<lenb; ++i) ch[cn++]=b[i]; string str2(ch); bitset<6> bs2(str2); int res=bs2.to_ulong(); ans[cans++]=f[res];//加密后的字符存入数组 } if(cans%4!=0) l=cans,r=((cans/4)+1)*4;//计算需要末尾补‘#’时 for(int i=l; i<r; ++i) ans[cans++]='='; /* for(int i=0; i<cans; ++i) cout<<ans[i]; cout<<endl;*/ memset(c,'\0',sizeof(c)); for(int i=0; i<cans; ++i)//本次计算得到的加密串复制到原串c以便下次加密 c[i]=ans[i];}int main(){#ifdef ONLINE_JUDGE#else freopen("G:/cbx/read.txt","r",stdin); //freopen("G:/cbx/out.txt","w",stdout);#endif ios::sync_with_stdio(false); cin.tie(0); int T,ca=0; cin>>T; while(T--) { int k; cin>>k; memset(c,'\0',sizeof(c)); cin>>c; for(int i=0; i<k; ++i)//k次加密 solve(c); int len=strlen(c); cout<<"Case #"<<++ca<<": "; for(int i=0; i<len; ++i)//输出结果 cout<<c[i]; cout<<endl; } return 0;}
0 0
- HDU 5237-Base64(模拟-K轮加密)
- hdu5237 Base64(模拟)
- Base64加密(Qt4版)
- java加密(1)Base64
- BASE64加密源码(JavaScript)
- Base64加密---加密学习笔记(一)
- HDU 5237 Base64 (Java大法好)
- HDU 5237 Base64
- hdu 5237 Base64
- HDU 5237 Base64
- HDU 5237 Base64
- Base64加密
- base64加密
- Base64加密
- base64加密
- base64加密
- Base64 加密
- Base64加密
- 第9章、Lift发送电子邮件,呼叫URL或调度任务
- for循环
- C++——string的深拷贝与浅拷贝
- 180_08_IO流_UML表示Reader和Writer的继承结构图
- sort 与有理数的个数
- HDU 5237-Base64(模拟-K轮加密)
- 第1章 焦油坑
- 1. Python开发--基础知识
- python 爬虫 | 检查网站情况
- 二叉树:二叉树视频笔记
- Caused by: java.lang.NoClassDefFoundError: IllegalName: spring/_day01/HelloWorld(2017.4.29))
- 单链表中判断是否有环以及得出环的入口点(简单易懂)
- Vim 必备插件
- redis和spring整合