习题:密码(思路题)

                                                                    密码
有一种文档的加密方法,包含了下述的翻译步骤:输入包含了一个字符串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

BW.OUT
datel

时间限制5s

分析:

  由题意我们可知输入的字符串为各个C字符串末尾的字符按顺序拼接成的,而每个C字符串都是由这个字符串中的字符组合成的,则每个字母都有机会处于某个C字符串首位,而字符串是按字典序排序的,由此将所有字符排序,即是所有C字符串开头字符组合的字符串。我们就可以知道每个字符串开头和末尾的字符是什么,而最后一个字符是从首位移来的,我们就可以知道首尾字符位置关系,又可以知道每个字符只出现一次,我们可以根据两两之间的位置关系得出C0。

代码:

var
  b:array[0..10000]of boolean;
  n,i,m,j,r:longint;
  s,v,s1:string;
  c:char;
begin
  assign(input,'BW.in');
  reset(input);
  assign(output,'BW.out');
  rewrite(output);
  readln(s); s1:=s;m:=length(s);
  readln(r);
  for i:=1 to length(s)-1 do
   for j:=i+1 to length(s) do
   if ord(s1[i])>ord(s1[j]) then
    begin
      c:=s1[i]; s1[i]:=s1[j]; s1[j]:=c;
    end;
  v:='';
  n:=r;
  fillchar(b,sizeof(b),false);
  while b[n]=false do
   begin
    v:=v+s[n];b[n]:=true;
    for i:=1 to m do
     if s1[n]=s[i] then begin n:=i; break; end;
   end;
  v:=v+v[1];
  delete(v,1,1);
  writeln(v);
  readln(i);
  close(input); close(output);
end.
View Code

 

转载于:https://www.cnblogs.com/qtyytq/p/4592498.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值