Программа, находящая в строке подпалиндром максимальной длины
Категория: Delphi/Pascal
2011-09-01 22:34:05
Палиндромом называется строка, которая одинаково читается как слева направо, так и справа налево. Подпалиндромом данной строки называется последовательность символов из данной строки, не обязательно идущих подряд, являющаяся палиндромом. Например, HELOLEH является подпалиндромом строки HTEOLFEOLEH. Строка должна быть длиной не более 100 символов, состоящая из заглавных букв латинского алфавита. В первой строке вывести длину максимального подпалиндрома, а во второй строке сам максимальный подпалиндром. Если таких подпалиндромов несколько, то вывести любой из них.
code: #pascal
- 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.
Поделиться: