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