NKPALIN - Chuỗi đối xứng
Tác giả: flashmt
Ngôn ngữ: Pascal
const maxn=2000;
var a,b,kq:array[0..maxn] of char;
f:array[0..maxn,0..maxn] of integer;
num:integer;
procedure rf;
begin
num:=0;
while not eoln do
begin
inc(num);
read(a[num]);
end;
end;
{---------------}
procedure pr;
var i,j:integer;
begin
fillchar(f,sizeof(f),0);
for i:=1 to num do
b[i]:=a[num-i+1];
for i:=1 to num do
for j:=1 to num do
begin
if f[i-1,j]>=f[i,j-1] then f[i,j]:=f[i-1,j]
else f[i,j]:=f[i,j-1];
if (a[i]=b[j]) and (f[i,j]<=f[i-1,j-1]) then
f[i,j]:=f[i-1,j-1]+1;
end;
end;
{---------------}
procedure wf;
var i,j,c,pre:integer;
begin
repeat
if a[i]=b[j] then
begin
write(a[i]);
dec(i);
dec(j);
end
else
begin
if f[i,j]=f[i-1,j] then dec(i)
else dec(j);
end;
until (f[i,j]=0);
end;
{---------------}
begin
rf;
pr;
wf;
end.