Да, это может быть сделано с использованием массива суффикса и массива LCP.
Предполагая, что вы знаете, как вычислить массив суффикса и массив LCP.
Let p[]
обозначают суффикс-массив lcp[]
обозначают массив LCP.
создать массив, в котором хранится количество отдельных подстрок до i'th
ранг суффикса. Это можно вычислить по этой формуле. Для получения дополнительной информации см Here
Пусть cum[]
обозначают кумулятивный массив, который может быть рассчитан следующим образом:
cum[0] = n - p[0];
for i = 1 to n do:
cum[i] = cum[i-1] + (n - p[i] - lcp[i])
Теперь для поиска i'th
подстроки просто найти нижнюю грань i
в совокупном массиве cum[]
что даст вам ранг суффикса, с которого должна начинаться ваша подстрока, и печатать весь символ до длины
i - cum[pos-1] + lcp[pos] // i lies between cum[pos-1] and cum[pos] so for finding
// length of sub string starting from cum[pos-1] we should
// subtract cum[pos-1] from i and add lcp[pos] as it is
// common string between current rank suffix and
// previous rank suffix.
, где pos
- значение возврата по нижней границе.
Весь вышеописанный процесс можно суммировать следующим образом:
string ithSubstring(int i){
pos = lower_bound(cum , cum + n , i);
return S.substr(arr[pos] , i - cum[pos-1] + lcp[pos]);// considering S as original character string
}
Для полной реализации суффикса массива, LCP и выше логики вы можете увидеть Here
Спасибо за такой быстрый ответ, я выясняя это в течение нескольких дней. Я пойму и осуществлю это как можно скорее и приму это как ответ. :) – PhoenixDD
Я добавил ссылку на полную реализацию вышеуказанной логики, вы можете проверить это, если у вас возникнет проблема с пониманием этого. – sudoer
Спасибо большое! :) – PhoenixDD