早教吧 育儿知识 作业答案 考试题库 百科 知识分享

vijos中的P1752潜伏者,请高手码个pascal的代码,一定要能AC的,谢谢!题目:R国和S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动。历尽艰险后,潜伏于S国的R国间谍小C

题目详情
vijos中的P1752潜伏者,请高手码个pascal的代码,一定要能AC的,谢谢!
题目:
R 国和 S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动。
历尽艰险后,潜伏于 S国的 R 国间谍小 C 终于摸清了 S国军用密码的编码规则:
1. S 国军方内部欲发送的原信息经过加密后在网络上发送,原信息的内容与加密后所
得的内容均由大写字母‘A’-‘Z’构成(无空格等其他字符) 。
2. S国对于每个字母规定了对应的“密字” 。加密的过程就是将原信息中的所有字母替
换为其对应的“密字” 。
3. 每个字母只对应一个唯一的“密字” ,不同的字母对应不同的“密字” 。 “密字”可以
和原字母相同。
例如,若规定‘A’的密字为‘A’ , ‘B’的密字为‘C’ (其他字母及密字略) ,则原信
息“ABA”被加密为“ACA” 。
现在,小 C 通过内线掌握了 S 国网络上发送的一条加密信息及其对应的原信息。小 C
希望能通过这条信息,破译 S 国的军用密码。小 C 的破译过程是这样的:扫描原信息,对
于原信息中的字母 x(代表任一大写字母) ,找到其在加密信息中的对应大写字母 y,并认为
在密码里 y是 x 的密字。如此进行下去直到停止于如下的某个状态:
1. 所有信息扫描完毕, ‘A’-‘Z’ 所有 26 个字母在原信息中均出现过并获得了相应
的“密字” 。
2. 所有信息扫描完毕,但发现存在某个(或某些)字母在原信息中没有出现。
3. 扫描中发现掌握的信息里有明显的自相矛盾或错误(违反 S国密码的编码规则) 。例
如某条信息“XYZ”被翻译为“ABA”就违反了“不同字母对应不同密字”的规则。
在小 C 忙得头昏脑涨之际,R 国司令部又发来电报,要求他翻译另外一条从 S 国刚刚
截取到的加密信息。现在请你帮助小 C:通过内线掌握的信息,尝试破译密码。然后利用破
译的密码,翻译电报中的加密信息。
▼优质解答
答案和解析
var
s1,s2,s3:string;
a,b:array['A'..'Z']of char;
i:longint;
c:char;
begin
readln(s1); readln(s2); readln(s3);//s1为一条加密信息,s2为原信息。通过他们找到密码与原码之间的对应关系。
//一个加密字母对应一个原码字母(用a表示);一个原码字母对应一个密码字母(用b表示)
fillchar(a,sizeof(a),' ');//赋初值,即没有找到对应的原码字母
fillchar(b,sizeof(b),' ');//赋初值,即没有找到对应的密码字母
for i:=1 to length(s1) do
if ((a[s1[i]]<>' ')and(a[s1[i]]<>s2[i]))//不为空格,就是说已经有相应的原码字母
//<>s2[i],说明有另一个不同的原码字母(s1[i]为原来已经有的),矛盾
or((b[s2[i]]<>' ')and(b[s2[i]]<>s1[i]))//不为空格,就是说已经有相应的密码字母
//<>s1[i],说明有另一个不同的密码字母,矛盾
then begin
writeln('Failed');
exit;
end
else begin
a[s1[i]]:=s2[i];//s1[i]对应的原码存在a数组中
b[s2[i]]:=s1[i];//s2[i]对应的密码存在b数组中
end;
for c:='A' to 'Z' do
if a[c]=' ' then//处理原来的密码和原码字任串时,里面有不存在的字母
begin
writeln('Failed');
exit;
end;
for i:=1 to length(s3) do
write(a[s3[i]]);
end.
看了 vijos中的P1752潜伏...的网友还看了以下: