難度分: 2063
這題是 rolling hash,同樣樣到 sliding window 的概念,由左至右需要處理除法問題,會使問題的難度增加,所以這題逆其道而行,從右至左,那就可以把除法問題變成乘法問題了。
在處理商數時,要小心處理負數,由於商數 d 必定介於 0~k之間,可以利用
- 證明:
令
str = dcba
,k = 3
,已知curr = mod(ap^2+bp+c, m)
求mod(bp^2+cp+d, m)
class Solution {
public:
string subStrHash(string s, int p, int mod, int k, int val) {
int n = s.size();
long pk = 1, curr = 0;
for (int i = 0; i < k; i++) {
curr = (curr * p + (s[n-1-i]-'a'+1)) % mod;
pk = (pk * p) % mod;
}
int j = n-k;
for (int i = k; i < n; i++) {
curr = (curr * p + (s[n-1-i]-'a'+1) + mod - ((s[n-1-i+k]-'a'+1) * pk) % mod) % mod;
if (curr == val) j = n-1-i;
}
return s.substr(j, k);
}
};