Программа, находящая в строке подпалиндром максимальной длины — Pascal(Паскаль)

Палиндромом называется строка, которая одинаково читается как слева направо, так и справа налево. Подпалиндромом данной строки называется последовательность символов из данной строки, не обязательно идущих подряд, являющаяся палиндромом. Например, 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.

Leave a Comment

− 6 = 3