字串hash可以通俗的理解為,把乙個字串轉換為乙個整數。
但是根據以前學習的hash, 會有衝突。
但是當我們取p為131 或者13331 ,mod取2^64時 99.99%的情況是不會有衝突的
hash公式
unsigned long long hash[n]
hash[i]=hash[i−1]∗p+id(s[i])
這裡的id(s[i]):我們直接取字母的ascii碼 或者 對字母x,我們規定id(x)=x−′a′+1
利用unsigned long long的範圍自然溢位,相當於自動對2^64−1取模
獲取子串的hash
如果我們求出乙個串的hash,就可以o(1)求解其子串的hash值。
模板:題目鏈結
#include
#include
#include
#include
#include
#include
#include
#define ll unsigned long long
#define inf 0x3f3f3f3f
using
namespace std;
const
int maxn=
1e5+
5,p=
131;
char s[maxn]
;ll p[maxn]
,h[maxn]
;ll getid
(int l,
int r)
intmain()
for(
int i=
0;i)return0;
}
字串Hash入門 例題詳解
最近打暑假多校,發現有許多字串演算法自己有所遺忘,今天就藉著補題在這開乙個坑,把那幾個基礎的字串演算法總結複習一下,順便寫幾個模板,供今後使用。這篇部落格主要就是總結一下字串hash,並提一下例題。我們學習乙個演算法,肯定要先知道它要解決的是什麼問題。字串hash,就是解決字串匹配問題的良藥,即尋找...
Hash 字串 字串雜湊
luo gu luogu luogup 3370 p3370 p337 0如題,給定n個字串 第i個字串長度為mi,字串內包含數字 大小寫字母 請求出n個字串中共有多少個不同的字串。第一行包含乙個整數n,為字串的個數。接下來n行每行包含乙個字串,為所提供的字串。輸出包含一行,包含乙個整數,為不同的字...
白兔的字串 字串hash
原題 一道典型的字串hash,至於hash,這裡講的非常好。一開始用map函式一直超時,後來改用unordered map就過了,至於這2個map的區別,這裡講的挺清楚的。之後去查了一下其它方法,發現還有一種方法是手寫map函式 強 指明 大佬 unordered map是跑了600ms,重寫跑了1...