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.