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.

 

posted @ 2017-02-06 09:24  Klaier  阅读(248)  评论(0编辑  收藏  举报