假设您获得长度为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
。
答案 0 :(得分:2)
子串s [A..B]的哈希是
hash[B] - R^(B - A + 1) * hash[A - 1] mod M
使用模幂运算来计算R mod M的幂。除非你预先计算了R的幂,否则无法在O(1)中计算它。