Палиндромом называется строка, которая одинаково читается как слева направо, так и справа налево. Подпалиндромом данной строки называется последовательность символов из данной строки, не обязательно идущих подряд, являющаяся палиндромом. Например, HELOLEH является подпалиндромом строки HTEOLFEOLEH. Строка должна быть длиной не более 100 символов, состоящая из заглавных букв латинского алфавита. В первой строке вывести длину максимального подпалиндрома, а во второй строке сам максимальный подпалиндром. Если таких подпалиндромов несколько, то вывести любой из них.
const
N = 100;
M = (N * (N + 1)) div 2;
type
Pair = record
left, right, prev, count: integer;
end;
var
inp, outp: text;
line, result: string;
index: integer;
list: array [1 .. M] of Pair;
procedure Find;
var
i, j, k, len, item: integer;
begin
len := length(line);
item := 1;
for i := 1 to len do
for j := len downto i do
if line[i] = line[j] then
begin
list[item].left := i;
list[item].right := j;
list[item].prev := 0;
list[item].count := 0;
for k := 1 to item - 1 do
begin
if (list[k].right > list[item].right) and
(list[k].left < list[item].left) and
(list[k].count >= list[item].count) then
begin
list[item].prev := k;
list[item].count := list[k].count + 1;
if list[item].count > list[index].count then
index := item
end;
end;
item := item + 1
end;
i := index;
result := line[list[i].left];
if list[i].right > i then
result := result + line[list[i].left];
while i > 0 do
begin
i := list[i].prev;
if i > 0 then
result := line[list[i].left] + result + line[list[i].left];
end
end;
begin
assign(inp, 'input.txt');
reset(inp);
readln(inp, line);
index := 1;
Find;
close(inp);
assign(outp, 'output.txt');
rewrite(outp);
writeln(outp, length(result));
writeln(outp, result);
close(outp);
end.