《原神攻略》釣魚什麼時候重新整理一次?釣魚重新整理時間介紹
阿新 • • 發佈:2022-02-20
思想:把字串變成數值比較。
我們選取這個 hash 公式:
\[hash(s)=\sum_{i=1}^{len} s_i\times p^{len-i}(mod\ M) \]hash方法
自然溢位hash
我們使用
unsigned long long hash[N];
(\(hash[k]\))來儲存一個字串下標 \([1,k]\) 的 hash 值
hash 公式就是:
\[hash(s_{1,len})=hash(s_{1,len-1})\times p + s_{len} \]我們知道 unsigned long long 在數值過大的時候會自動對 \(2^{64}\) 取模
單hash
採用一個一大一小兩個素數
hash 公式:
\[hash(s_{1,len})=(hash(s_{1,len-1})\times p + s_{len})\%M \]hash 衝突的概率不高
雙hash
取兩不同的模數分別hash
hash 公式:
\[hash_1(s_{1,len})=(hash_1(s_{1,len-1})\times p + s_{len})\%M_1 \]\[hash_2(s_{1,len})=(hash_2(s_{1,len-1})\times p + s_{len})\%M_2 \]然後取 \(make\_pair(\ hash_1(s),hash_2(s)\ )\)
求子串hash值
公式:
\[hash(s_{l,r})=((hash(s_{1,r})-hash(s_{1,l-1}))\times p^{r-l+1})\%M+M)\%M \]差分思想,很好理解(注意減法可能出現負數)
乘 \(p^{r-l+1}\) 是為了能抵消無關字元的 hash 值。
舉個例子:
\[hash(s_{1,1})=s_1 \]\[hash(s_{1,2})=s_1\times p + s_2 \]\[hash(s_{1,3})=s_1\times p^{2} + s_2\times p + s_3 \]算一算\(hash(s_{2,3})\)大概就能理解了。