Используйте дерево префиксов вместо дерева суффиксов.Затем пробежитесь по этому дереву и на любом узле выведите строку, встреченную до сих пор, плюс количество поддеревьев, которые все еще доступны.
РЕДАКТИРОВАТЬ:
На самом деле это слишком ранои я испортил некоторую номенклатуру:
Дерево префиксов - это дерево, которое хранит общие префиксы только один раз.Дерево суффиксов хранит все суффиксы в дереве префиксов.Итак, я имел в виду здесь дерево суффиксов (которое также является особым видом дерева префиксов).
Итак, вы делаете следующее:
- Создайте дерево суффиксов
Выполнить поиск по дереву префиксов, начиная с корня
function search( node ) {
c = node.symbol;
if not children.empty then
for each child in node.children do
sub_search = search( child )
other_results.append( sub_search.results );
sub_trees += sub_search.num_trees
done
for each result in other_results do
append c to result
done
return c :: other_results
else
return {results = c; num_trees = 1 }
fi
}
Если я не сделал никакой ошибки, это должно сработать.Суффиксная часть дерева суффиксов заботится об устранении всех суффиксов, а префиксная часть - об устранении всех префиксов.Поскольку оба хранятся в сокращенном виде, вы получаете строки между ними (которые, возможно, уже были сохранены вместе).Обратите внимание, что это не включает сжатие в дереве, которое обычно не требуется, если ваши строки не становятся очень длинными.