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.

Download