题目描述题目要求破解凯撒密码。加密时将字母A∼Z\texttt{A} \sim \texttt{Z}A∼Z映射为1∼261 \sim 261∼26空格映射为000然后加上密钥KKK模272727得到密文。解密时需要尝试所有K0∼26K 0 \sim 26K0∼26选择使解密后文本中匹配词典中的单词数量最多的KKK。输出解密后的文本并按要求分行每行不超过606060字符单词不能跨行。输入格式首先输入词典每行一个单词大写字母长度≤20\le 20≤20以#结束。然后输入一行密文长度≤250\le 250≤250字符。输出格式输出解密后的文本每行尽量长但不超过606060字符单词不跨行。样例输入THIS DAWN THAT THE ZORRO OTHER AT THING # BUUBDLA PSSPABUAEBOX输出ATTACK ZORRO AT DAWN题目分析本题的核心是尝试所有密钥统计匹配的单词数选择最优密钥。解密过程对于每个KKK000到262626将密文字符转换为数字空格为000A∼Z\texttt{A} \sim \texttt{Z}A∼Z为1∼261 \sim 261∼26减去KKK模272727后转回字符。评分将解密后的文本按空格分割成单词统计在词典中出现的单词数量。选择匹配数最大的KKK。输出格式将解密后的文本按单词输出每行不超过606060个字符单词间用空格分隔。注意行首不能有空格行尾不能有空格。复杂度分析词典大小≤100\le 100≤100密文长度≤250\le 250≤250尝试272727个密钥每次分割单词并查词典可接受。代码实现// Caesar Cypher// UVa ID: 554// Verdict: Accepted// Submission Date: 2017-02-21// UVa Run Time: 0.000s//// 版权所有C2017邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;intmain(intargc,char*argv[]){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);setstringdictionary;string word;while(cinword,word!#)dictionary.insert(word);string sentence;cin.ignore(1024,\n);getline(cin,sentence);intmax_matches0,K0;string plain;for(intk0;k26;k){intmatches0;string original;for(inti0;isentence.length();i){intlettersentence[i] ?0:(sentence[i]-64);letter(letter27-k)%27;if(letter0)original ;elseoriginal(char)(letter64);}istringstreamin(original);while(inword)if(dictionary.count(word)1)matches;if(matchesmax_matches){max_matchesmatches;Kk;plainoriginal;}}vectorstringwords;stringstreamout(plain);while(outword)words.push_back(word);inti0,j0;while(iwords.size()){if(j0){if((j1words[i].length())60){cout\n;j0;}else{cout words[i];j(1words[i].length());i;}}else{coutwords[i];jwords[i].length();i;}}if(j0)cout\n;return0;}