You are on page 1of 7

BI TON XU PALINDROME (XU I XNG)

NGUYN THNH NAM T TIN HC


Palindrome hay cn gi l xu i xng, xu i gng l tn gi ca nhng xu k
t m khi vit t phi qua tri hay t tri qua phi th xu khng thay i. VD:
MADAM, IOI,... Nh tnh cht c bit m c kh nhiu bi tp c lin quan n
Palindrome, phn ln trong chng thng i km vi QH. Ti xin gii thiu vi cc
bn mt vi bi tp nh vy.
Bi 1: Xem mt xu c phi l Palindrome hay khng? y l mt bi c bn, nhng
quan trng v n c cp n trong nhiu bi tp khc. Cch lm tt nht l duyt
n thun mt O(N).
CODE
function is_palindrome(s: string): boolean;
var i, n : integer;
begin
n := length(s);
for i := 1 to (n div 2) do
if s[i] <> s[n+1-i] then
begin is_palindrome := false; exit; end;
is_palindrome := true;
end; [/i]
Mt on chng trnh khc :
CODE
function is_palindrome(s : string) : boolean;
var i, j : integer;
begin
i := 1;
j := length(n);
while i < j do
begin
if s[i] <> s[j] then
begin is_palindrome := false; exit; end;
inc(i);
dec(j);
end;
is_palindrome := true;
end;
Bi 2: Cho mt xu S <= 1000 k t; tm palindrome di nht l xu con ca S ( Xu
con l mt dy cc k t lin tip ).

y cng l mt bi c bn vi nhiu cch lm.


[i]Cch 1: QH
Dng mng F[i, j] c ngha: F[i, j] = true/false nu on gm cc k t t i n j ca
S c/khng l palindrome.
Ta c cng thc l:
* F[i, i] = True
* F[i, j] = F[i+1, j-1]; ( nu s[i] = s[j] )
* F[i, j] = False; ( nu s[i] <> s[j] )

on chng trnh nh sau:


CODE
FillChar( F, sizeof(F), false );
for i := 1 to n do F[i, i] := True;
for k := 1 to (n-1) do
for i := 1 to (n-k) do
begin
j := i + k;
F[i, j] := ( F[i+1, j-1] ) and (s[i] = s[j] );
end;

iKt qu l : Max(j-i+1) <=j tha F[i,j] = True.


phc tp thut ton l 0(N^2).
[i]Ch : Vi N ln, ta phi thay mng 2 chiu F bng 3 mng 1 chiu v dng thm
bin max lu gi tr ti u.
Cch 2: Duyt c cn.
Ta xt tng v tr i:
+ xem a c phi l tm ca Palindrome c l k t khng?
( v d Palindrome MADAM c tm l k t D )
+ xem a[i] v a[i+1] c phi l tm ca Palindrome c chn k t khng?
( v d Palindrome ABBA c tm l 2 k t BB )

vi mi k t ta tm palindrome di nht nhn n l tm, cp nhp li kt qu khi


duyt. Ta duyt t gia ra dng kt qu hin ti lm cn.
on chng trnh nh sau:

CODE
procedure Lam;
var i, j : Longint;
{}
procedure try( first, last : Longint );
var : Longint;
begin
if first = last then
begin := 1; dec(first); inc(last); end
else := 0;
repeat
if (first < 1) or (last > N) then break;
if s[i] = s[j] then
begin
:= + 2;
first := first - 1;
last := last + 1;
end
else break;
until false;
if max < dd then max := dd;
end;
{}
begin
i := n div 2;
j := n div 2 + 1;
max := 1;
while (i > max div 2) and (j <= N-max div 2) do
begin
if i > max div 2 then
begin
try( i, i );
try( i, i+1 );
end;
if j <= N - max div 2 then
begin
try( j, j );
try( j, j+1 );

end;
i := i - 1;
j := j + 1;
end;
end;

Cch lm ny c phc tp: max*(N-max). V vy n chy nhanh hn cch QH


trn, thi gian chm nht khi max = N/2 cng ch mt N2/4 nhanh gp 4 ln cch
dng QH. Nh vy, chng ta bit l: khng phi lc no QH cng chp nhn c
v mt thi gian v khng phi lc no duyt lc no cng chm.
Bi trn cn c mt cch NlogN na l dng Suffix Aray, thm ch c cch O(N) l
s dng Suffix Tree v thut ton tm LCA. ng nhin cch ci t khng h d
dng, ti s tho lun vi cc bn vo mt dp khc.
Bi 3: Chia mt xu thnh t nht cc Palindrome ( di <=1000).Bi ny phc tp
hn bi trn, cch lm th vn l QH.
Gi F[i] l s palindrome t nht m on 1..j chia thnh c.
Ta c cng thc:
F[i] = max( F[j] + 1; "j < i tha mn:on j+1..i l palindrome)
on chng trnh nh sau:

CODE
F[0] := 0;
for i := 1 to n do
begin
for j := i-1 downto 0 do
if (on j+1..i l palindrome) then F[i] := max( F[i], F[j]+1 );
end;

Hai vng for lng nhau mt O(N^2), phn kim tra on j+1..i l palindrome hay
khng mt O(N), vy phc tp thut ton l O(N^3). S khng c kh thi nu N
= 1000. gim phc tp thut ton, ta s dng mng L[i, j] c ngha tng t
nh mng F[i, j] bi 1. QH lp mng L[i, j] mt N2. Tng cng l O(N^2) v mi
ln kim tra ch mt O(1).

Nhng n y li ny sinh vn : mng L[i, j] khng th lu c khi N=1000 v


b nh ca chng ta ch c 640KB. Mt cch khc phc l dng x l bt. Nhng c
cch n gin hn l dng hai mng mt chiu L[i] v C[i] c ngha:
* L[i] l di ln nht ca palindrome di l nhn s[i] lm tm;
* C[i] l di ln nht ca palindrome di chn nhn s[i] v s[i+1] lm tm;
L[i] v C[i] c th tnh c bng cch 2 bi 2 trong O(N2). Phn kim tra ta vit li
nh sau:

CODE
function is_palindrome(i, j : integer) : boolean;
var : integer;
begin
:= j-i+1;
if o () then is_palindrome := (L[(i+j) div 2] >= n)
else is_palindrome := (C[(i+j) div 2] >= n)
end;

Vy thut ton ca chng ta c phc tp tnh ton l O(N2), chi ph b nh l


O(N).
Bi 4 [i]: Pal - Ioicamp - Marathon 2005-2006- tun 17
Cho mt xu, hi n c bao nhiu xu con l palindrome; xu con y gm cc k
t khng cn lin tip ( di <= 120 ).
V D:
Pal.inp
IOICAMP
Pal.out
9
y l mt bi tp rt th v. Phng php l dng QH.
Gi F[i, j] l s palindrome l xu con ca on i..j.
Ta c cng thc :
* F[i, i] = 1;
* F[i, j] = F[i+1, j] + F[i, j-1] - F[i+1, j-1] + T;

Nu s = s[j] th T = F[i+1, j-1] + 1;


Nu s[i] <> s[j] th T = 0;
on chng trnh nh sau :

CODE
procedure lam;
var k, i, j : integer;
begin
n := length(s);
for i := 1 to n do F[i, i] := 1;
for k := 1 to n-1 do
for i := 1 to n-k do
begin
j := i+k;
F[i, j] := F[i, j-1] + F[i+1, j] - F[i+1, j-1];
if s[i] = s[j] then F[i, j] := F[i, j] + F[i+1, j-1] + 1;
end;
end;

chng trnh chy nhanh hn, chng ta sa li on m mt cht nh sau :

CODE
procedure lam2;
var k, i, j : integer;
begin
n := length(s);
for i := 1 to n do F[i, i] := 1;
for k := 1 to n do
for i := 1 to n-k do
begin
j := i+k;
F[i, j] := F[i, j-1] + F[i+1, j];
if s[i] = s[j] then F[i, j] := F[i, j] + 1
else F[i, j] := F[i, j] - F[i+1, j-1];
end;
end;

on chng trnh trn ch c tnh m phng, mun hon thin bn phi ci t cc


php tnh cng tr s ln v kt qu c th ln ti 2n-1. phc tp ca thut ton l

O(N2). V vy, chng ta hon ton c th lm vi N = 1000, kh cn rt gn mng


F thnh ba mng mt chiu.
Bi 5: [i]Palindrome - IOI 2000
Cho mt xu, hi phi thm vo n t nht bao nhiu xu k t n tr thnh mt
palindrome ( di <= 500).
Bi ny cng s dng QH:
Gi F[i, j] l s php bin i t nht cn thm vo on i..j on i..j tr thnh
palindrome.
Ta c cng thc :
* F[i, i] = 0;
* Nu s = s[j] th F[i, j] = F[i+1, j-1]
* Nu s[i] <> s[j] th F[i, j] = Min( F[i, j-1], F[i+1, j] ) + 1;
Mun chng trnh chy vi n = 500 th cn rt gn F thnh ba mng mt chiu.
Mun truy vt, bn phi dng mng bt hoc dng d liu ng.
thc hnh, bn hy lm bi tp sau :
Bi 6: The next palindrome - SPOJ
Cho nhiu s <= 106, vi mi s, tm s b nht c dng palindrome ln hn s
cho. M rng vi cu hi: Tm s b th k?
V D :
Input:
2
808
2133
Output:
818
2222
[i]Gi : dng phng php m kt hp QH

You might also like