4112:情报破译-Cryptanalysis
总时间限制: 1000ms 内存限制: 65536kB
描述
A国和B国正在进行一场战争。A国通过间谍知道B国的情报加密规则为:
-
仅对字母加密,其他符号保留(如空格,逗号等)
-
对第i个单词(i从1开始)的加密方法是把第i个单词反转(如abc变成cba),然后对单词内的每个字母采用经典的Caesar加密法,循环后移i个字母。例如:第5个单词的加密表如下所示:
密码字母:A B C D E F G H I J K L M N O P Q R S T U VW X Y Z
原文字母:V W X Y Z A B C D E F G H I J K L M N O P QR S T U
- 单词的定义是:任何一串极大的连续字母串。
比如,样例输出第三行,第二个单词为ba,反转后为ab,a后移2个单词变成c,b后移两个单词变成d,故该单词加密后为cd(见样例输入第三行)。
现在A国又截获了一些B国的情报密文。请你帮A国破译出情报的内容。
输入
一共有不超过int范围行,每行为一个字符串(int范围)。注意,每行是可以以空格开头的。
输出
情报破译后得到的内容。每条情报对应输出一行。
样例输入
fiU umncv oolz ioex jhfqu, zg uh zqI nlaxO ockl yz kmpzgE.
fX gxcj , ghlsxffr cxmG K.
ab3cd
样例输出
The talks will take place, at an Air Force base on Sunday.
We have , occupied City F.
az3ba
问题链接:Bailian4112 情报破译-Cryptanalysis
问题简述:(略)
问题分析:简单文本处理题,不解释。要尽量使用库函数,注意模除的使用。
程序说明:(略)
参考链接:(略)
题记:模除可以用于循环有关的处理。
AC的C++语言程序如下:
/* Bailian4112 情报破译-Cryptanalysis */
#include <bits/stdc++.h>
using namespace std;
const int N = 100000;
char s[N + 1], t[N + 1];
void reverse(char *s, int l, int r)
{
char t;
while(l < r) {
t = s[l];
s[l] = s[r];
s[r] = t;
l++, r--;
}
}
int main()
{
int start, end;
while(gets(s) != NULL) {
int sb = 1;
for(int i = 0; s[i]; i++) {
if(isalpha(s[i])) {
start = i;
while(isalpha(s[i])) i++;
end = i;
reverse(s, start, end - 1);
for(int j = start; j < end; j++)
if(isupper(s[j]))
s[j] = 'A' + (s[j] - 'A' - sb + 26) % 26;
else if(islower(s[j]))
s[j] = 'a' + (s[j] - 'a' - sb + 26 ) % 26;
sb++;
}
}
puts(s);
}
return 0;
}