[英]Algorithm searching substring difference
我在任務中有一個大問題:在 O(1) 時間內找到 substring 的任何 hash
長度=n的輸入字符串的Hash按公式計算:
h(S) = ( s(1)*a^(n-1) + s(2)*a^(n-2)+...+s(n-1)a+s(n) )% R,其中 's' 是 ASCII 碼。
1)我在字符串中找到所有前綴 hash
2)我嘗試通過公式得到 substring 的 hash :
h(RL) = (h(R) - h(L-1))*a^(R-L+1) 例如 string = 'abcdefgh',substing 是 'd'。 a = 1000,R = 1000009;
我在 java 中的代碼:
import java.io.IOException;
import java.math.BigInteger;
public class PrefixHashFAILED {
public static long[] hashes;
public static void main(String[] args) throws IOException {
int a = 1000;
int modul = 1000009;
char[] data = "abcdefgh".toCharArray();
hashes = new long[data.length];
long res = 0L;
for( int i = 0 ; i < data.length ; i ++){
res = ((res*a)%modul + data[i]%modul)%modul;
hashes[i] = res;
}
System.out.println(getHash(3,3,a,modul));
}
private static long getHash(int start, int end , int a, int m) {
long x = (hashes[end] - hashes[start-1]+m)%m;
long z = BigInteger.valueOf(a).pow(end - start + 1 ).mod(BigInteger.valueOf(m)).intValue();
return (x*z)%m ;
}
}
在 function getHash 我試圖得到 hash 的 substring 'd'。 正確答案是 100,但我得到 999857。幫幫我,錯誤在哪里?
結果是
(hashes[end] - hashes[start-1] * z % m + m) % m
但不是
(hashes[end] - hashes[start-1] + m) % m * z % m
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.