Pascal题目
PASSWORD有一种文档的加密方法,包含了下述的翻译步骤:输入包含了一个字符串C有n个小写字母,C=c1c2...cn,所有的字符都是不一样的。如果把第一个字符移到最后...
PASSWORD
有一种文档的加密方法,包含了下述的翻译步骤:输入包含了一个字符串C有n个小写字母,C=c1c2...cn,所有的字符都是不一样的。如果把第一个字符移到最后一个,我们就创造了一个新的字符串。我们把Ck定义为:ck+1ck+2....cnc1c2..ck,把原字符串定义为C0。
例如,C0=eldat时 C3=datel。
我们把所有的C0...Cn-1按照字典顺序排序得到一个字符表格。我们依次把每个字符串最后一个字符记入S,r定义为C0所在的位置。也许是一个魔术,我们可以通过S和r来确定原来那个C。
翻译的例子:
输入的C是datel
我们可以得到C0..Cn-1
datel
ateld
telda
eldat
ldate
按照字典顺序排列可得
ateld
datel
eldat
ldate
telda
于是,我们得到S为dltea,r为2,因为datel在第二个位置上。
任务
你的程序将输入S和r,并输出C。
可以假设这样的C一定存在。
样例
BW.IN
dltea
2
BW.OUT
datel
足球队 众所周知,一只足球队由11球员组成,其中有一名守门员和一名队长。
现在,有22人组成的一个候选名单,从中要选出11人参加比赛。选拔规则如下:
首先提供一个阵型,例如,4-4-2。第一个4表示有4名后卫,第二个4表示有4名中场,第三个2表示有2名前锋。当然,还有一个位置就是留给守门员的。
每个人都有自己唯一能打的位置(前锋、中场、后卫、守门员)。在每个位置上,以球员的编号为关键字,从小到大依次选取。
选出球队后还要选出队长。队长是球队中参加比赛次数最多的球员。如果有并列,取编号较大的球员做队长。
输入
前22行每行按如下格式表示出一名球员的信息:
Number Name Role year1-year’1 year2-year’2…
整数Number(<=100)是该球员编号。字符串Name(length<=20)是该球员名字。字符Role是该球员所能打的位置(S前锋、M中场、D后卫、G守门员)。每一对yeari-year’i(yeari<=year’i)表示该球员效力的时间段,例如2001-2002表示该球员效力了两年2001年和2002年。至少有1对年份,最多20对年份。年份是一个四位数。同一个年份不会出现在两对年份中。球员的编号在球队中是唯一的。
第23行给出一个阵型,例如4-4-2。保证阵型有且仅有3个正整数组成,且和等于10。例如,4-3-2-1是不合法的。
输出
输出选出的11名球员,每一行包括球员编号,姓名,场上所打位置。之间用一个空格隔开。球员按守门员、后卫、中场、前锋的顺序排序,相同位置按编号从小到大排序。如果一名球员是队长,那么无论他打什么位置,都放在序列的第一个。如果无法找出11个满足条件的球员,输出“IMPOSSIBLE TO ARRANGE”。
样例
FootballTeam.in
9 PlayerA M2000-2001 2003-2006
2 PlayerB M2004-2006
10 PlayerC D2001-2005
1 PlayerD D2000-2001 2002-2004
11 PlayerE S2003-2006
8 PlayerF M2005-2006
22 PlayerG S2005-2006
25 PlayerH G2000-2001 2002-2003 2005-2006
6 PlayerI D2003-2006
26 PlayerJ D2003-2004 2000-2001
18 PlayerK M2003-2004
19 PlayerL M2000-2001 2003-2006
7 PlayerM S2003-2006 1999-2001
21 PlayerN S2003-2006
13 PlayerO S2005-2006
15 PlayerP G2001-2006
14 PlayerQ D2003-2004
5 PlayerR S2000-2005
20 PlayerS G2000-2002 2003-2003
12 PlayerT M2004-2005
3 PlayerU D2000-2005
4 PlayerZ M2001-2004
4-4-2
FootballTeam.out
7 PlayerM S
15 PlayerP G
1 PlayerD D
3 PlayerU D
6 PlayerI D
10 PlayerC D
2 PlayerB M
4 PlayerZ M
8 PlayerF M
9 PlayerA M
5 PlayerR S 展开
有一种文档的加密方法,包含了下述的翻译步骤:输入包含了一个字符串C有n个小写字母,C=c1c2...cn,所有的字符都是不一样的。如果把第一个字符移到最后一个,我们就创造了一个新的字符串。我们把Ck定义为:ck+1ck+2....cnc1c2..ck,把原字符串定义为C0。
例如,C0=eldat时 C3=datel。
我们把所有的C0...Cn-1按照字典顺序排序得到一个字符表格。我们依次把每个字符串最后一个字符记入S,r定义为C0所在的位置。也许是一个魔术,我们可以通过S和r来确定原来那个C。
翻译的例子:
输入的C是datel
我们可以得到C0..Cn-1
datel
ateld
telda
eldat
ldate
按照字典顺序排列可得
ateld
datel
eldat
ldate
telda
于是,我们得到S为dltea,r为2,因为datel在第二个位置上。
任务
你的程序将输入S和r,并输出C。
可以假设这样的C一定存在。
样例
BW.IN
dltea
2
BW.OUT
datel
足球队 众所周知,一只足球队由11球员组成,其中有一名守门员和一名队长。
现在,有22人组成的一个候选名单,从中要选出11人参加比赛。选拔规则如下:
首先提供一个阵型,例如,4-4-2。第一个4表示有4名后卫,第二个4表示有4名中场,第三个2表示有2名前锋。当然,还有一个位置就是留给守门员的。
每个人都有自己唯一能打的位置(前锋、中场、后卫、守门员)。在每个位置上,以球员的编号为关键字,从小到大依次选取。
选出球队后还要选出队长。队长是球队中参加比赛次数最多的球员。如果有并列,取编号较大的球员做队长。
输入
前22行每行按如下格式表示出一名球员的信息:
Number Name Role year1-year’1 year2-year’2…
整数Number(<=100)是该球员编号。字符串Name(length<=20)是该球员名字。字符Role是该球员所能打的位置(S前锋、M中场、D后卫、G守门员)。每一对yeari-year’i(yeari<=year’i)表示该球员效力的时间段,例如2001-2002表示该球员效力了两年2001年和2002年。至少有1对年份,最多20对年份。年份是一个四位数。同一个年份不会出现在两对年份中。球员的编号在球队中是唯一的。
第23行给出一个阵型,例如4-4-2。保证阵型有且仅有3个正整数组成,且和等于10。例如,4-3-2-1是不合法的。
输出
输出选出的11名球员,每一行包括球员编号,姓名,场上所打位置。之间用一个空格隔开。球员按守门员、后卫、中场、前锋的顺序排序,相同位置按编号从小到大排序。如果一名球员是队长,那么无论他打什么位置,都放在序列的第一个。如果无法找出11个满足条件的球员,输出“IMPOSSIBLE TO ARRANGE”。
样例
FootballTeam.in
9 PlayerA M2000-2001 2003-2006
2 PlayerB M2004-2006
10 PlayerC D2001-2005
1 PlayerD D2000-2001 2002-2004
11 PlayerE S2003-2006
8 PlayerF M2005-2006
22 PlayerG S2005-2006
25 PlayerH G2000-2001 2002-2003 2005-2006
6 PlayerI D2003-2006
26 PlayerJ D2003-2004 2000-2001
18 PlayerK M2003-2004
19 PlayerL M2000-2001 2003-2006
7 PlayerM S2003-2006 1999-2001
21 PlayerN S2003-2006
13 PlayerO S2005-2006
15 PlayerP G2001-2006
14 PlayerQ D2003-2004
5 PlayerR S2000-2005
20 PlayerS G2000-2002 2003-2003
12 PlayerT M2004-2005
3 PlayerU D2000-2005
4 PlayerZ M2001-2004
4-4-2
FootballTeam.out
7 PlayerM S
15 PlayerP G
1 PlayerD D
3 PlayerU D
6 PlayerI D
10 PlayerC D
2 PlayerB M
4 PlayerZ M
8 PlayerF M
9 PlayerA M
5 PlayerR S 展开
1个回答
展开全部
这两题都是好题啊。
第一题,涉及简单的密码破解,而且不涉及数论中的复杂知识,想一下RSA加密吧……
以它给的例子,我们来看一下怎样找到最初的C:
代码写出来是:
var a:array[1..1000]of char;
ans:array['a'..'z']of char;
s:string;
t:char;
r,i,j,k:integer;
begin
readln(s);
readln(r);
k:=length(s);
for i:=1 to k do a[i]:=s[i];
for i:=1 to k-1 do //冒泡排序;
for j:=i+1 to k do
if a[i]>a[j] then
begin
t:=a[i];
a[i]:=a[j];
a[j]:=t;
end;
for i:=1 to k do
ans[s[i]]:=a[i];
t:=a[r];
for i:=1 to k do
begin
write(t);
t:=ans[t];
end;
end.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询