Здравствуйте!
Когда я отправляю свою програмку на проверку, она проходит не все тесты. А я вот, такие тесты, на которых она не работает, подобрать не могу. Поэтому, может быть, кто-то поможет мне найти такие примеры?)
Вот такая задача:
Для данного слова (последовательности строчных латинских букв) выведите следующее за ним (в лексикографическом порядке) слово, которое может быть получено из данного перестановкой букв (анаграмму). Если данное слово уже является последним среди всех своих анаграмм, то необходимо вывести первую возможную (в лексикографическом порядке) анаграмму.
Входные данные
Задана последовательность слов, по одному слову в строке. Длина одного слова не превышает 50 символов.
Выходные данные
Необходимо вывести результат для каждого полученного на вход слова.
PHP код:
program project1;
type mess=array [1..50] of string;
var
M:mess;
pr,i,min,v,count,maincount:integer;
SaveStr,Str:string;
b:char;
f:textfile;
begin
count:=0;
Assign(f, 'input.txt');
reset(f);
while not eof(f) do begin
Str:='';
readln(f,Str);
M[count]:=Str;
inc(count);
end;
close(f);
mainCount:=count;
count:=0;
repeat
Str:=M[count];
SaveStr:=Str;
if ((length(str)=1) or (length(str)=0)) then else begin
pr:=Length(Str)-1;
i:=Length(Str);
while ((Str[pr]{!!!!}>=Str[i]) and (pr>1)) do begin// 7
pr:=pr-1;
i:=i-1;
end;//7 находится перв.
min:=i;//6
for v:=i to Length(Str) do if ((Str[v]>Str[pr]) and (Str[v]<Str[min])) then min:=v;
if (Str[pr]<Str[min]) then begin
b:=Str[min];
Str[min]:=Str[pr];
Str[pr]:=b;//6 перв. меняется с миним. послед.
v:=(Length(Str));
if ((i<>Length(Str))and(Str[pr+1]>Str[v])) then begin
if (Length(Str)=3) then
for v:=(Length(Str)) downto (((Length(Str)-PR)div 2)+pr+1) do begin//5
b:=Str[v];
Str[v]:=Str[pr+Length(Str)-v+1{!!!!}];
Str[pr+Length(Str)-v+1{!!!!}]:=b;
end//5 меняется порядок остальных
else
for v:=(Length(Str)) downto (((Length(Str)-PR)div 2)+pr+1{!!!!}) do begin//5
b:=Str[v];
Str[v]:=Str[pr+Length(Str)-v+1{!!!!}];
Str[pr+Length(Str)-v+1{!!!!}]:=b;
end;//5 меняется порядок остальных
end;
end;
if SaveStr=Str then begin
for v:=1 to (Length(Str)div 2) do begin//5
b:=Str[v];
Str[v]:=Str[Length(Str)-v+1];
Str[Length(Str)-v+1]:=b;
end//5 меняется порядок остальных
end;
end;
writeln(str);
inc(count);
until count=maincount;
readln;
end.