比較する単一の X と単一の Y があると想定しています。それらを連結し、どちらにも現れないマーカー文字で区切って、例えば XoY を形成します。http://en.wikipedia.org/wiki/Suffix_arrayを線形時間で形成します。
得られるのは、連結された文字列内の位置へのポインターの配列です。ポインターは、ポインターが指す部分文字列が配列内でアルファベット順に表示されるように配置されています。また、LCP 配列を取得し、サフィックスと配列内のその直前のサフィックスの間で共有される最長の共通プレフィックスの長さを示します。これは実際には、その位置とそれよりも小さい部分文字列の間で共有される最長の共通プレフィックスです。これは、共通プレフィックスが長く、string[i] より小さいものはすべて、それと現在の文字列 [i - 1] の間でソートされるためです。
X は Y の前にあるため、ポインターが指している元の文字列をその位置から判断できます。配列を X ポインターと Y ポインターのサブセクションに交互に分割できます。pos[i] と pos[i - 1] の間で共有される共通のプレフィックスの長さは lcp[i] です。pos[i] と pos[i-2] の間で共有されるプレフィックスの長さは、min(lcp[i], lcp[i-1]) です。したがって、X の範囲の直前の Y 値から開始すると、各ステップで min 操作を実行してセクションをステップ ダウンすることで、その Y とすべての X の間のプレフィックスの文字数を計算できます。同様に、これらすべての X と接尾辞配列で次に現れる Y の間で共有される接頭辞の文字数を、X ごとに 1 分のコストで計算できます。もちろん、Y 範囲についても同様です。
同じ位置から始まるこれより1文字長い文字列は他の性別にはまったく表示されないため、XまたはYのいずれか内の部分文字列が必要だと思います。上記の min() 計算を実行したら、ヒープを使用して N 個の最小プレフィックス部分文字列を抽出し、N 個の最小エントリを追跡できると思います。ここではすべて、|X| に比例して時間がかかると思います。+ |Y| (N が |X| または |Y| に匹敵する場合を除く)。