Предположим, вам задана строка 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
Хэш подстроки s [A..B] является
hash[B] - R^(B - A + 1) * hash[A - 1] mod M
Используйте модульное возведение в степень, чтобы вычислить мощность R mod M. И нет, если вы не вычислили мощности R, невозможно вычислить это в O (1).