利用大質數或其他對應函式把字串轉為乙個正整數來快速判斷字串相等
通常可以模乙個大質數或使用自然溢位
實現(例);
const int p = 1e9+7;
const int di = 1331;
hash[i] = (hash[i-1] * base + s[i]) % p;
其中\(base\), 我稱之為底數, p我稱之為模數, 事實上自然溢位相當於模了\(2^\)
數學構造
隨機資料(依據生日悖論
如果乙個班級有23個人, 那麼其中有兩個人生日相同的概率超過50%surprise 這與大部分人的直覺相違背, 所以稱之為生日悖論
為什麼會這樣呢, 是自己的直覺不靠譜嗎?
不, 我們可以考慮另乙個問題, 如果乙個班裡有23人包括自己, 有人生日和自己相同的概率是多少?
沒錯, 大概為\(6%\)左右, 這是與直覺近似的, 其實我們的直覺正是把"有人生日相同"和"有人生日和自己相同"的概念相混, 實際有人生日和自己相同的概率確實很小
證明可以用排列組合開心的手玩一下
樣本容量為\(n\), 有兩個樣本相同的概率為
\[1.18\sqrt
\]考慮生日攻擊, 隨機乙個1e5大小的字串, 詢問長度為\(l\)的本質不同子串有多少個, 用大質數\(hash\)和字尾陣列(也可以用自然溢位\(hash\))對拍, 輸出不同子串的終止位置, 拿\(fc\)命令對比一下, 找出\(hash\)值相等的不同子串
正確性如生日悖論, 大概有超過\(50%\)的機率成功, 實際上質數不強的時候有很多相同
自然溢位\(hash\)在資料隨機的情況下正確性極高, 因為它的值域很大, 很難生日攻擊
考慮特殊構造:
構造\(aaaa\cdots aaaa\) 和 \(baaa\cdots aaaa\)兩個長度相等且長度大於64的串
底數的六十四次方以上模\(p\)就會為零, \(b\)和\(a\)也會被判為相等
不太好卡, 要用神仙的構造方法:
設乙個串\(s\), \(s[1] = 'a'\) 設$ |s| = strlen(s + 1)$ 為\(s\)的長度
定義$ (!s)$ 為\(s\)中的字元全部\('a'變'b', 'b'變'a',\) 當然\(s\)中只含有\('a'\)和\('b'\)兩種字元
定義串\(s1 + s2\)為\(s1\)串在前\(s2\)串在後拼接起來, \(hash(s1)\) 為\(s1\)的雜湊值
類似數列的, 我們定義乙個"字串列", 為乙個字串集合, 後乙個字串可以通過前乙個字串推出
\(s_1 = "a"\)
\[s_i = s_ + (!s_)
\]則\(s_i\)的長度為\(2^\)
\[hash(s_i) = hash(s_) * base^|} + hash((!s_)) \\
= hash(s_) * base^} + hash((!s_)) \\
hash((!s_)) = hash((!s_)) * base^} + hash(s_) \\
hash(s_i) - hash((!s_)) = (hash(s_) - hash((!s_))) * base^} - (hash(s_) - hash((!s_)))\\
hash(s_i) - hash((!s_)) = (hash(s_) - hash((!s_))) * (base^} - 1)
\]希望得到 \(2^ | hash(s_i) - hash(!s_i)\) 設\(g_i = hash(s_i) - hash(!s_i)\)
\(g_i=g_*(base^}-1)\) 每個 \((base^}-1)\) 都是偶數, 這使得g到第64項就就可以卡掉hash了,
但事實上12位以上就行, 因為
\[base^}-1=(base^}-1)*(base^}+1)
\]為乙個偶數乘乙個偶數, 而左邊的可以繼續遞迴下去, 所以原式整除\(2^i\) 然後就結束啦
長大後, 我要當毒瘤, 爺爺奶奶可高興了, 給我愛吃的...
品德養成記
2015年 世界衛生報告 顯示,中國男性的平均壽命為74.6歲。按照75歲算,乙個人的一生只有900個月,而我的人生已走過三分之一。這20多年的時間大多數都是在學校度過,一路走來,有許多缺點,也有很多遺憾。接下來的三分之二,希望自己好好珍惜,過得更有意義。下面是我參考精神導師富蘭克林寫下的十三種品德...
牛牛偶像養成記
為了拯救因入學人數驟降,面臨廢棄的學校,牛牛決定成為偶像啦。當然,作為乙個偶像,肯定是要上台表演的。已知牛牛拿到了n個上台表演的機會,第i次表演的上台時間為ti時刻,需要表演mi這麼長的時間。牛牛為了提高自己的知名度,肯定要取得最多的上場次數。請問,牛牛最多能上場多少次呢?輸入描述 第一行輸入乙個數...
多多養成記104
十二點多多醒來了,要拉便便,弄好出去扔尿不濕看了下表一點,哄多多睡覺,我從睡眠中清醒過來,看多多睡著了,去洗漱,看了下表一點四十。躺下然後竟然睡不著了,很少的多多這個點還沒有睡,近兩個月她都每天十一點就睡著了,我也睡的早一點了。然後看看手機,很沒勁,睡不著,也不知道該咋辦,後來就三點多了。夜裡不知道...