program RawTcherv;
function IncPost(var I:integer):integer;
begin
Result:=I;
Inc(I);
end;
// из символов 1...9 из входной строки составить палиндром с минимальным значением
function MakeMinPalindromeMaxLength(const S:string):string;
var
A:array[1..9] of byte;
I,J,Fino,Cur,Center:integer;
begin
FillChar(A{%H-},sizeof(A),0);
// вычисляем количество разных цифр, встреченных во введённой строке
For I:=1 to Length(S) do
if S[I] in ['1'..'9'] then
Inc(A[ord(S[I])-ord('0')])
else
break;
// максимальная длина палиндрома равна длине строки
Cur:=1;
Center:=-1;
SetLength(Result,Length(S));
// составляем палиндром. В начало вставляем половину всех цифр от мин. к макс.
For I:=1 to 9 do begin
// поиск минимального числа, которое можно вставить в центр
if (A[I] mod 2=1) and (Center
Center:=I;
// вставляем в начало строки половину символов
Fino:=A[I] div 2;
For J:=1 to Fino do
Result[IncPost(Cur)]:=chr(I+ord('0'));
// оставшуюся половину вставим потом
A[I]:=Fino;
end;
// вставляем центральный символ
if Center>0 then
Result[IncPost(Cur)]:=chr(Center+ord('0'));
// вставляем в обратном порядке символы палиндрома
For I:=9 downto 1 do begin
For J:=1 to A[I] do
Result[IncPost(Cur)]:=chr(I+ord('0'));
end;
// восстанавливаем длину строки
SetLength(Result,Cur-1);
end;
procedure Test(const S:string);
var
S1:string;
begin
S1:=MakeMinPalindromeMaxLength(S);
Writeln('Orig=',S);
Writeln('Pal =',S1);
Writeln('Diff=',Length(S)-Length(S1));
Writeln;
end;
begin
Test('9998888776665432111');
Readln;
end.