1. 程式人生 > 資訊 >努比亞釋出新音 C1 真無線耳機:藍芽 5.3 / 8+32 小時長續航,158 元

努比亞釋出新音 C1 真無線耳機:藍芽 5.3 / 8+32 小時長續航,158 元

思想:把字串變成數值比較。

我們選取這個 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值

公式:

\[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})\)大概就能理解了。