an implementation of the Ukkonen algorithm that creates suffix trees in linear time