Ну да, просто Крускал - это вроде из другой оперы.
Без деталей, и вряд ли это будет понятно, увы. Кажется на алголисте было описание этого алгоритма.
type
TTree = префиксное дерево банка текстов, в которых производится поиск
procedure FindMovement (vertex)
begin
// находим максимальный суффикс, являющийся префиксом какого-либо текста
// это делается аналогично такому же методу в алгоритме Кнута-Мориса-Пратта, только тут у нас не один текст, а префиксное дерево
end;
procedure FindStringInTexts (string, position, vertex);
begin
if no childs of the vertex then
return "Найдено"
for the every child of the vertex do
if the child_letter is string[position] then
FindStringInTexts (string, position+1, child)
if no hit obtained then
FindStringInTexts (string, position, movment for child);
end;
procedure AhoCorasic(Str: string; texts);
begin
1. Build the prefix tree (при этом добавляем фиктивные листья, маркирующие коноцы текстов - см. пример).
2. Ищем функции перехода
Для каждого узла ф.п. - это такой предковй узел (возможно, не непосредственный предок, на который надо переходить, если найдено несовпадение символов.)
for the every child of the top vertex do
FindMovments (child)
FindStringInTexts (Str + '$', 1, TopVertexOfTheTree)
end;
Пример построения префиксного дерева
Даны тексты
abcabac
abcab
caba
abcaabac
Добавляем фиктивный конечный символ, отсуствующий в алфавите
abcabac$
abcab$
caba$
abcaabac$
Имеем дерево
a-b-a-c-$
|
Top-a-b-c-a-b-a-c-$
| |
| $
|
Lc-a-b-a-$