【已解决】问题: rolling hash中mod计算技巧不理解

https://cp-algorithms.com/string/string-hashing.html

https://leetcode.com/problems/find-substring-with-given-hash-value/discuss/1730100/Java-rolling-hash(back-to-front)

求字符串s的rolling hash

加法操作后取模 (a + b)% m

规则:(a + b + c) % m = (a % m + b % m + c%m) %m

其实,只要在做完“+”的操作后,对和再取一次模,就能保证结果的正确性,(期间,可能重复多次取模,不影响最终结果)

比如(2 + 5 + 3 + 7) % 2 = 1

可以这么计算:

(2 % 2 + 5 + 3 + 7)% 2 = 1

( ((2 % 2) + 5 ) % 2 + 3 + 7 ) % 2 =1

long sum = 0;
for(int i = s.length() - 1; i >= 0; s--){
    long val = s.charAt(left) - 'a' + 1;
    sum = (sum * power + val) % modulo;
}        

减法操作后取模 (a - b) % m

规则:(a - b) % m = (a % m - b % m + m) %m

其实,只要在做完“-”的操作后,对差值再取一次模,就能保证结果的正确性

被减数,减数 可以多次取模,也可以不取模,只要保证:求完差值后,一定要取模

比如(7 - 2) % 3

可以这么计算:

(7 % 3 - 2 + 3 )% 3 = 2 等价于 (7 % 3 - 2 % 3 + 3 ) % 3 = 2

posted @ 2022-02-07 18:30  nunuZhang  阅读(55)  评论(0)    收藏  举报