noip模拟题《迷》enc
【问题背景】
zhx 和他的妹子聊天。
【问题描述】
考虑一种简单的加密算法。
假定所有句子都由小写英文字母构成, 对于每一个字母, 我们将它唯一地映射到另一个字母。例如考虑映射规则:a->b, b->c, c->d, d->a. 那么单词bad就会被映射为cba。这个映射规则的“逆映射规则”为: b->a, c->b, d->c, a->d。对于密文 cba,我们很容易将它解密为 bad。当然, 这样的映射需要保证每一个字母映射到的字母是不同的(即不可以出现两个不同的字母
映射到同一个字母, 否则将会无法解密)。
一种常见的密码攻击方式被称为已知明文攻击。 具体地, 在你不知道映射表的情况下, 给你一
段明文和对应的密文,你可以推导出一些的映射规则,下一次你收到一条密文,你就可能可以解密它。现在你需要完成这样的一个系统。
【输入格式】
第一行包含一个字符串,仅包含小写字母,表示一段明文。
第二行包含一个字符串,仅包含小写字母,表示这段明文对应的密文,保证两行长度相同。
第三行包含一个字符串,仅包含小写字母,表示你需要解密的密文。
【输出格式】
输出共一行,表示输入中第三行密文对应的明文。如果不能解密,输出“ERROR”(不包含引号)。注意输入可能出现不自恰的情况。
【样例输入】
ab
cc
cc
【样例输出】
ERROR
【样例输入】
ab
ab
c
【样例输出】
ERROR
【样例输入】
abcde
bcdea
cad
【样例输出】
bec
【数据范围与规定】
对于100%的数据, 所有字符串长度<=1000。
这题没什么可说的,简单模拟,需要考虑的特殊情况知道25个字母的映射就可以求出另一个,第一次我就这么被坑了。
1 program enc(input,output);
2 var
3 f,g:array['a'..'z']of char;
4 i,l:longint;
5 j,k:char;
6 a,b:ansistring;
7 begin
8 assign(input,'enc.in');assign(output,'enc.out');reset(input);rewrite(output);
9 readln(a);readln(b);
10 l:=length(a);
11 for j:='a' to 'z' do f[j]:=' ';
12 for i:=1 to l do
13 if f[a[i]]=' ' then f[a[i]]:=b[i]
14 else if f[a[i]]<>b[i] then begin write('ERROR');close(input);close(output);halt; end;
15 for j:='a' to 'z' do g[j]:=' ';
16 for j:='a' to 'z' do if f[j]<>' ' then
17 begin
18 if g[f[j]]=' ' then g[f[j]]:=j
19 else if g[f[j]]<>j then begin write('ERROR');close(input);close(output);halt; end;
20 end;
21 i:=0;
22 for j:='a' to 'z' do if f[j]=' ' then inc(i);
23 if i=1 then
24 begin
25 for j:='a' to 'z' do if f[j]=' ' then break;
26 for k:='a' to 'z' do if g[k]=' ' then break;
27 g[k]:=j;
28 end;
29 readln(a);
30 l:=length(a);
31 for i:=1 to l do
32 if g[a[i]]=' ' then begin write('ERROR');close(input);close(output);halt; end
33 else write(g[a[i]]);
34 close(input);close(output);
35 end.