Bailian4112 情报破译-Cryptanalysis【密码】

4112:情报破译-Cryptanalysis
总时间限制: 1000ms 内存限制: 65536kB
描述
A国和B国正在进行一场战争。A国通过间谍知道B国的情报加密规则为:

  1. 仅对字母加密,其他符号保留(如空格,逗号等)

  2. 对第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

  1. 单词的定义是:任何一串极大的连续字母串。

比如,样例输出第三行,第二个单词为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 

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;
}

你可能感兴趣的:(Bailian4112,情报破译)