您的位置:首页 > 其它

[VIjos 字符串还原]

2011-11-10 23:46 260 查看
[题目来源]:vijsoOrz教主第一次模拟赛

[关键字]:模拟

[题目大意]:每个字符串有三种变换方法:1、倒序;2、所有字母后移k个(k未知);3、所有字母前以k个(k未知),给出三个同一字符串变换后的,求出原字符串。

//=====================================================================================================

[分析]:因为三个变换法则中只有第一个可以确定原串,所以枚举每一个作为倒序后的字符串,还原后与另外两个匹配看是否符合2、3。

[代码]:

View Code

program project1;
var
s: array[1..3] of ansistring;
n: longint;

procedure init;
begin
readln(n);
readln(s[1]);
readln(s[2]);
readln(s[3]);
end;

function make(s: ansistring):ansistring;
var
s1: ansistring;
i: longint;
begin
s1 := '';
for i := n downto 1 do
s1 := s1+s[i];
exit(s1);
end;

function done(s1, s2, s3: ansistring):boolean;
var
i, k, temp: longint;
begin
k := ord(s2[1])-ord(s1[1]);
if k < 0 then k := ord('z')-ord(s1[1])+ord(s2[1])-ord('a')+1;
//writeln(k);
if k > 6 then exit(false);
for i := 2 to n do
begin
temp := ord(s2[i])-ord(s1[i]);
if temp < 0 then temp := ord('z')-ord(s1[i])+ord(s2[i])-ord('a')+1;
if k <> temp then exit(false);
end;
k := ord(s1[1])-ord(s3[1]);
if k < 0 then k := ord('z')-ord(s3[1])+ord(s1[1])-ord('a')+1;
//writeln(k);
if k > 6 then exit(false);
for i := 2 to n do
begin
temp := ord(s1[i])-ord(s3[i]);
if temp < 0 then temp := ord('z')-ord(s3[i])+ord(s1[i])-ord('a')+1;
if temp <> k then exit(false);
end;
exit(true);
end;

function work: ansistring;
var
i, j: longint;
s1: ansistring;
begin
s1 := make(s[1]);
if done(s1,s[2],s[3]) or done(s1,s[3],s[2]) then exit(s1);
//writeln(s1,'1');

s1 := make(s[2]);
if done(s1,s[1],s[3]) or done(s1,s[3],s[1]) then exit(s1);
//writeln(s1,'2');

s1 := make(s[3]);
if done(s1,s[1],s[2]) or done(s1,s[2],s[1]) then exit(s1);
//writeln(s1,'3');
end;

begin
assign(input,'d:\1.in');reset(input);
assign(output,'d:\1.out');rewrite(output);
init;
writeln(work);
close(input);
close(output);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: