hash就是吧乙個字母對映成乙個數字(樹,圖,字串都可對映)
通過對映的 hash值 進行比較。
在對映 hash值 可能會發生衝突,即不同字串對映成一樣的\(hash\)值。失效。
對於字串來說,我們常把字串看成k進製數(k>26,k為質數!!),然後對乙個大指數取摸,餘數就是此字串的 hash值 。
有時也用自然溢位為代價加快效率。
先預設要模的大質數和位進製;
ll base = 131;
ll mod = 2123400401301379571;
之後對每個字串進行hash預處理運算
for(int i = 1;i <= n; i++)
hs[i] = (hs[i-1] * base+idx(s[i]))%mod;//idx(sp[i]):第s[i]個字元所對映的數字
預處理\(\ power\)陣列, (\(\ power[i]\) 表示當前 \(k\) 進製下,\(k\) 的 \(i\) 次方)
power[0] = 1;
for(int i = 1;i <= n; i++)
\(2345\),我只要 \(345\) ,那麼就需要 \(\)
由上述預處理可知,現在我們雜湊陣列 \(ha\) 中的數分別為
\[\begin
ha[1] & = 2\times10^0 \ 即2\\
ha[2] & = 2 \ \times10^1+3 \ \times10^0 \ 即23\\
ha[3] & = 2 \ \times10^2+3 \ \times10^1+4 \ \times10^0 \ 即234\\
ha[4] & = 2 \ \times10^3+3 \ \times10^2+4 \ \times10^1+5 \ \times10^0\ 即2345\\
\end
\]那麼 \(後三位的字元應該是=2345-2000=345=ha[4]-ha[(2-1)]\times 10^\) ;
同理 \(45 = ha[4] - ha[2]\times 10^\)
那麼 \(k\) 進製數也是如此,因此就有了下面的公式。
// l r 表示需要的區間的字元邊界
int hash_interval(int l,int r)
\[\begin
ha[1] & = 1\times29^0(1) \\
ha[2] & = 1 \ \times29^1+2 \ \times29^0(12) \\
ha[3] & = 1 \ \times29^2+2 \ \times29^1+3 \ \times29^0(123)\\
ha[4] & = 1 \ \times29^3+2 \ \times29^2+3 \ \times29^1+4 \ \times29^0(1234)\\
...\\
\end
\]\[\begin
ha[3-4]& = ha[4]-ha[2]\times29^2(34) \\
&=1234-1200(12\times 29^2)\\
& = 34
\end
\]注:我是用10進製進行舉例,方便~
sqlplus課堂筆記
desc user tables select from user tables where table name emp update 表名 set 列名 修改後資料 where 行名 aaa create table student id number 5,2 primary key,sname...
linux課堂筆記
rw r r 第一位有 d,l 表示普通檔案,d表示目錄,l表示連線檔案 快捷方式 接下來三位為一組,分別表示u所有者,g所屬組,o其他人。r讀,w寫,x執行 代表acl許可權 數字代表引用計數 開頭的檔案代表隱藏檔案 系統檔案 ls l簡稱ll就是ls的詳細資訊 建立目錄 mkdir make d...
課堂筆記六
偵錯程式 gdb 程式除錯工具 使用 gcc g test.c o test gdb test gdb run 執行程式 gdb list 檢視 gdb quit 退出 gdb break 21 執行到21行 gdb next 單步執行 gdb print 變數名 檢視變數數 gdb continu...