• 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.
  • 相关阅读:
    《数据密集型应用系统设计》读书笔记
    每周总结
    每周总结
    每周总结
    《数据密集型应用系统设计》读书笔记
    每周总结
    《重构》读书笔记
    每周总结
    软件过程与管理知识回顾
    操作系统知识汇总5-6章
  • 原文地址:https://www.cnblogs.com/Currier/p/6369118.html
Copyright © 2020-2023  润新知