5817. 【NOIP提高A组模拟2018.8.15】 抄代码

Description

J 君是机房的红太阳,每次模拟她总是 AK 虐场。然而在 NOIP2117 中,居然出现了另一位 AK 的选手 C 君! 这引起了组委会的怀疑,组委会认为 C 君有抄袭 J 君代码的嫌疑,原因是考试时 C 君正好 坐在 J 君旁边。于是组委会需要你帮她们鉴定一下 C 君是否抄了 J 君的代码。 NOIP2117 一共有 T 道题,每道题需要提交一份阿语言代码 (阿语言是 NOIP2117 的唯一可 用编程语言)。 一份阿语言代码只有一行,仅由小写字母,数字,空格和分号组成。 组委会认为,如果 C 君的代码可以由 J 君的代码经过若干次修改变量名操作得到,C 君就 抄了 J 君的代码。 一次修改变量名操作被定义为将代码中的所有小写字母 x 替换为小写字母 y(此处 x, y 代指 任意小写字母)。 请你告诉组委会,对于每道题,C 君是否抄了 J 君的代码。
 

Input

第一行一个正整数 T。 接下来 2T 行,第 2i 行代表 J 君对于第 i 道题的提交代码,第 2i + 1 行代表 C 君对于第 i 道题的提交代码。 
 

Output

输出 T 行,如果对于第 i 道题,C 君抄了 J 君的代码,请在第 i 行输出1,否则请在第 i 行 输出0。 
 

Solution

C 君抄了 J 君的代码当且仅当以下条件被满足:

1. 两个代码的长度相等

2. 两个代码所有非字母位置的字符对应相等

3. 考虑 J 君代码中一个字母 x 出现的所有位置,在 C 君的代码中,这些位置的字母须相等。

时间复杂度 O(T L),其中 L 为每行代码长度。

代码

 1 var
 2   c:array ['a'..'z'] of longint;
 3   s1,s2:ansistring;
 4   TT:longint;
 5 function fd(cc:char):boolean;
 6 begin
 7   if (ord(cc)>=97) and (ord(cc)<=122) then
 8     exit(true);
 9   exit(false);
10 end;
11 
12 procedure main;
13 var
14   i,l1,l2:longint;
15   cc:char;
16 begin
17   l1:=length(s1);
18   l2:=length(s2);
19   if l1<>l2 then
20     begin
21       writeln('0');
22       exit;
23     end;
24   for cc:='a' to 'z' do
25     c[cc]:=0;
26   for i:=1 to l1 do
27     if s1[i]<>s2[i] then
28       begin
29         if (not fd(s1[i])) or (not fd(s2[i])) then
30           begin
31             writeln('0');
32             exit;
33           end;
34         if c[s1[i]]=0 then c[s1[i]]:=ord(s2[i]) else
35           if c[s1[i]]<>ord(s2[i]) then
36             begin
37               writeln('0');
38               exit;
39             end;
40       end;
41   writeln('1');
42 end;
43 
44 begin
45   assign(input,'copycat.in');
46   assign(output,'copycat.out');
47   reset(input);
48   rewrite(output);
49   readln(TT);
50   while TT>0 do
51     begin
52       readln(s1);
53       readln(s2);
54       main;
55       dec(TT);
56     end;
57   close(input);
58   close(output);
59 end.
原文地址:https://www.cnblogs.com/zyx-crying/p/9482076.html