Потому что вы здесь делаете:
for (size_t i = 0; i < N; i++)
suffixes[i] = s.substr(i);
is: Создать N
подстроки длиной 0, 1, 2, ..., N
Общий объем памяти, который они будут использовать: 1 + 2 + 3 + ... + N
байт. Имея в руках старого доброго Гаусса, вы обнаружите, что сумма первых N
чисел равна: N * (N + 1) / 2
Теперь, если вы установите N = 100000, это приведет к примерно 5 ГБ потребления памяти - что больше, чем макс. 2 ГБ адресного пространства, которое обычно имеется в вашей программе, если только вы не запускаете ее в 64-битной системе.
Редактировать : Я не знаю, в чем заключается проблема, которую вы пытаетесь решить, однако ваша реализация кажется странной:
Вы никогда не используете вычисленные суффиксы: единственная используемая вами функция SuffixArray
- это lcp
, которая не ссылается на сохраненный вектор suffixes
. Так зачем они вам нужны?