Вычислить хеш подстроки с учетом хешей всех префиксов строки

1

Предположим, вам задана строка S длины N а также массив хеш-значений всех префиксов строки S hash[0][0...N-1].

hash[0][i] обозначает хэш префикса строки S заканчивающийся индексом i. M обозначает большое правое целое число. R обозначает радиус, используемый в хэш-функции.

Вам также предоставляется используемая функция хэша:

for(int i = 0; i < N; i++) {
    hash[0][i] = ( (i > 0 ? hash[0][i - 1] : 0) * R + S.charAt(i) ) % M;
}

Нам нужно вычислить hash[i][j] на основе потребности. Можем ли мы узнать хэш-значение подстроки S в O(1) т.е. hash[i][j] учитывая приведенную выше информацию?

where, i,j > 0 and i,j < N

Примечание: массив hash[][] изначально содержит только предварительно вычисленные хэши hash[0][0....N-1] префиксов строки S

Теги:
string
algorithm
hash

1 ответ

2

Хэш подстроки s [A..B] является

hash[B] - R^(B - A + 1) * hash[A - 1] mod M

Используйте модульное возведение в степень, чтобы вычислить мощность R mod M. И нет, если вы не вычислили мощности R, невозможно вычислить это в O (1).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню