| 题目名称 | 1654. [BOI2001]破译密码 |
|---|---|
| 输入输出 | cra.in/out |
| 难度等级 | ★★ |
| 时间限制 | 0 ms (0 s) |
| 内存限制 | 0 MiB |
| 测试数据 | 10 |
| 题目来源 |
|
| 开放分组 | 全部用户 |
| 提交状态 | |
| 分类标签 | |
| 分享题解 |
| 通过:1, 提交:9, 通过率:11.11% | ||||
|
|
100 | 0.000 s | 0.00 MiB | Answer |
|
|
20 | 0.000 s | 0.00 MiB | Answer |
|
|
10 | 0.000 s | 0.00 MiB | Answer |
|
|
0 | 0.000 s | 0.00 MiB | Answer |
|
|
0 | 0.000 s | 0.00 MiB | Answer |
|
|
0 | 0.000 s | 0.00 MiB | Answer |
|
|
0 | 0.000 s | 0.00 MiB | Answer |
|
|
0 | 0.000 s | 0.00 MiB | Answer |
|
|
0 | 0.000 s | 0.00 MiB | Answer |
| 关于 破译密码 的近10条评论(全部评论) | ||||
|---|---|---|---|---|
|
为啥我下载的压缩包是空的
![]()
2016-02-19 16:37
2楼
| ||||
|
这道题的加密规则是这样的:有10个数a0~a9,然后对于文章第i个字母(注意是字母),把它往后移a[i%10]位,比如'A'向后移两位变成'C',而'Z'向后移两位变成'B'
2014-06-04 21:13
1楼
| ||||
密码学是一种给信息编码的科技,使得只有特定的接收者才能解读它们。另一方面,密码分析学,是破译密码的科学。在这个问题中,假设你是一位密码分析学家,被雇用来破译一些在警察对当地黑手党总部的突袭中截获的加密信息。你的同行已经通过逆向工程得到了加密程序,剩下唯一要做的就是逆向分析加密算法并且猜测这些文件的密钥。与这些密文一起,警察还截获了一些明文,他们确信这些明文和密文来自相同的文章,因此在措辞,语法等方面有着相似的结构。
C语言版本:
/* crypto.c */
#include <stdio.h>
#include <ctype.h>
#include <string.h>
const int len = 10;
const char *let = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int main()
{
char s1[250], s2[250];
FILE *f1, *f2;
unsigned char key[len];
int i, k, c;
char *p;
printf("Input file: "); gets(s1);
f1 = fopen(s1, "rt");
printf("Output file: "); gets(s2);
f2 = fopen(s2, "wt");
printf("Key (%d bytes): ", len);
for (i = 0; i < len; ++i) scanf("%d", &key[i]);
k = 0;
while ((c = fgetc(f1)) != EOF) {
p = strchr(let, toupper(c));
if (p != NULL) {
i = ((p - let) + key[k]) % strlen(let);
c = let[i];
k = (k + 1) % len;
}
fputc(c, f2);
}
fclose(f1);
fclose(f2);
return 0;
}
Pascal语言版本:
{ crypto.pas }
const
len = 10;
let = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var
s1, s2 : string;
f1, f2 : text;
key : array [1..len] of byte;
i, k : integer;
c : char;
begin
write ('Input file: '); readln (s1);
assign (f1, s1); reset (f1);
write ('Output file: '); readln (s2);
assign (f2, s2); rewrite (f2);
write ('Key (', len, ' bytes): ');
for i := 1 to len do read (key[i]);
k := 0;
while not eof (f1) do begin
while not eoln (f1) do begin
read (f1, c);
i := pos (upcase (c), let);
if i > 0 then begin
k := k mod len + 1;
i := (i - 1 + key[k]) mod length (let) + 1;
c := let[i];
end;
write (f2, c);
end;
if not eof (f1) then begin
readln (f1);
writeln (f2);
end;
end;
close (f1);
close (f2);
end.
由于COGS的环境限定,本题的数据格式较为特殊。
有5组测试数据。第i组数据包含两个.in文件:crai.in和cra(i+5).in。其中,前者是密文,后者是来源于相同文章的一段明文(即题目描述中所说的.txt文件)。
例如,第1组数据是cra1.in和cra6.in,其中cra1.in是密文,cra6.in是相同来源的明文,第3组数据是cra3.in和cra8.in,其中cra3.in是密文,等等。
你需要提交10个.out文件:cra1.out~cra10.out。其中,cra1.out~cra5.out是五组数据破译后的结果,cra6.out~cra10.out的内容分别与cra6.in~cra10.in完全相同。