[题目来源]:vijsoOrz教主第一次模拟赛
[关键字]:模拟
[题目大意]:每个字符串有三种变换方法:1、倒序;2、所有字母后移k个(k未知);3、所有字母前以k个(k未知),给出三个同一字符串变换后的,求出原字符串。
//=====================================================================================================
[分析]:因为三个变换法则中只有第一个可以确定原串,所以枚举每一个作为倒序后的字符串,还原后与另外两个匹配看是否符合2、3。
[代码]:
View Code
1 program project1;
2 var
3 s: array[1..3] of ansistring;
4 n: longint;
5
6 procedure init;
7 begin
8 readln(n);
9 readln(s[1]);
10 readln(s[2]);
11 readln(s[3]);
12 end;
13
14 function make(s: ansistring):ansistring;
15 var
16 s1: ansistring;
17 i: longint;
18 begin
19 s1 := '';
20 for i := n downto 1 do
21 s1 := s1+s[i];
22 exit(s1);
23 end;
24
25 function done(s1, s2, s3: ansistring):boolean;
26 var
27 i, k, temp: longint;
28 begin
29 k := ord(s2[1])-ord(s1[1]);
30 if k < 0 then k := ord('z')-ord(s1[1])+ord(s2[1])-ord('a')+1;
31 //writeln(k);
32 if k > 6 then exit(false);
33 for i := 2 to n do
34 begin
35 temp := ord(s2[i])-ord(s1[i]);
36 if temp < 0 then temp := ord('z')-ord(s1[i])+ord(s2[i])-ord('a')+1;
37 if k <> temp then exit(false);
38 end;
39 k := ord(s1[1])-ord(s3[1]);
40 if k < 0 then k := ord('z')-ord(s3[1])+ord(s1[1])-ord('a')+1;
41 //writeln(k);
42 if k > 6 then exit(false);
43 for i := 2 to n do
44 begin
45 temp := ord(s1[i])-ord(s3[i]);
46 if temp < 0 then temp := ord('z')-ord(s3[i])+ord(s1[i])-ord('a')+1;
47 if temp <> k then exit(false);
48 end;
49 exit(true);
50 end;
51
52 function work: ansistring;
53 var
54 i, j: longint;
55 s1: ansistring;
56 begin
57 s1 := make(s[1]);
58 if done(s1,s[2],s[3]) or done(s1,s[3],s[2]) then exit(s1);
59 //writeln(s1,'1');
60
61 s1 := make(s[2]);
62 if done(s1,s[1],s[3]) or done(s1,s[3],s[1]) then exit(s1);
63 //writeln(s1,'2');
64
65 s1 := make(s[3]);
66 if done(s1,s[1],s[2]) or done(s1,s[2],s[1]) then exit(s1);
67 //writeln(s1,'3');
68 end;
69
70 begin
71 assign(input,'d:\1.in');reset(input);
72 assign(output,'d:\1.out');rewrite(output);
73 init;
74 writeln(work);
75 close(input);
76 close(output);
77 end.