Nadesłany przez Tomasz Lubiński, 23 marca 2007 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
BM - Delphi/BM.dpr:
// Algorytm Boyer-Moore
// Tomasz Lubinski (c) 2008
// www.algorytm.org
program BM;
{$APPTYPE CONSOLE}
uses
SysUtils, Math;
var
bad_character_shift : array[0..255] of Integer;
good_suffix_shift : array[1..100] of Integer;
suff : array[1..100] of Integer;
//prepare bad character shift table
procedure pre_bad_character_shift(pattern: String);
var
i: Integer;
m: Integer;
begin
m := length(pattern);
for i := 0 to 255 do
bad_character_shift[i] := m;
for i := 1 to m - 1 do
bad_character_shift[Integer(pattern[i])] := m - i;
end;
//prepare suff table
procedure pre_suff(pattern: String);
var
i, j: Integer;
m: Integer;
begin
m := length(pattern);
suff[m] := m;
for i := m - 1 downto 1 do
begin
for j := 0 to i do
if pattern[i-j] <> pattern[m-j] then
break;
suff[i] := j;
end;
end;
//prepare good_suffix_shift table
procedure pre_good_suffix_shift(pattern: String);
var
i,j: Integer;
m: Integer;
begin
m := length(pattern);
pre_suff(pattern);
for i := 1 to m do
good_suffix_shift[i] := m;
for i := m downto 1 do
if suff[i] = i then
for j := 0 to m - i do
if good_suffix_shift[j] = m then
good_suffix_shift[j] := m - i;
for i := 1 to m do
good_suffix_shift[m - suff[i]] := m - i;
end;
//Boyer-Moore algorithm
procedure BM_alg(text: String; pattern: String);
var
i, j : Integer;
found : Boolean;
m : Integer;
n : Integer;
begin
m := length(pattern);
n := length(text);
pre_bad_character_shift(pattern);
pre_good_suffix_shift(pattern);
j := 0;
while (j <= n - m) do
begin
found := true;
for i := m downto 1 do
if pattern[i] <> text[i + j] then
begin
found := false;
break;
end;
if found = true then
begin
write(IntToStr(j) + ' ');
j := j + good_suffix_shift[1];
end
else
j := j + max(good_suffix_shift[i], bad_character_shift[Integer(text[i + j])] - m + i);
end;
end;
var
pattern : String;
text : String;
begin
writeln('Podaj tekst');
readln(text);
writeln('Podaj wzorzec');
readln(pattern);
BM_alg(text, pattern);
readln;
end.

