TOPALIN - Palindrome String

Tác giả: flashmt

Ngôn ngữ: Pascal

const fi='';
      fo='';
      maxn=100100;
var n,re:longint;
    a:array[1..maxn] of char;
    num:array[1..62] of longint;
    b:array[1..62] of longint;
    d,dau:array[1..62] of byte;
    s:array[1..62] of char;
    r:array['0'..'z'] of longint;


procedure init;
var c:char; i:longint;
begin
     for i:=1 to 10 do
     begin
          s[i]:=chr(i+47);
          r[chr(i+47)]:=i;
     end;
     for i:=11 to 36 do
     begin
          s[i]:=chr(i+54);
          r[chr(i+54)]:=i;
     end;
     for i:=37 to 62 do
     begin
          s[i]:=chr(i+60);
          r[chr(i+60)]:=i;
     end;
end;

procedure rf;
begin
     assign(input,fi);
     reset(input);
     n:=0;
     fillchar(num,sizeof(num),0);
     fillchar(d,sizeof(d),0);
     while not eoln do
     begin
          inc(n);
          read(a[n]);
          inc(num[r[a[n]]]);
     end;
     close(input);
end;

procedure pr;
var i,j,max,sum,p,q,t:longint;
begin
     for i:=1 to 62 do b[i]:=i;
     re:=0;
     for i:=1 to n div 2 do
     begin
          p:=r[a[i]]; q:=r[a[n-i+1]];
          if b[p]<>b[q] then
          begin
               d[p]:=1; d[q]:=1;
               t:=b[p];
               for j:=1 to 62 do
                   if b[j]=t then b[j]:=b[q];
          end;
     end;
     for i:=1 to 62 do
         if (num[i]>0) and (d[i]=1) then
         begin
              p:=b[i]; d[i]:=0;
              max:=num[i]; sum:=max;
              for j:=1 to 62 do
                  if (b[j]=p) and (d[j]=1) then
                  begin
                       sum:=sum+num[j];
                       d[j]:=0;
                       if num[j]>max then max:=num[j];
                  end;
              re:=re+sum-max;
         end;
end;

procedure wf;
begin
     assign(output,fo);
     rewrite(output);
     write(re);
     close(output);
end;

begin
     init;
     rf;
     pr;
     wf;
end.

Download