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.