字串Hash入門

2021-09-26 09:27:21 字數 954 閱讀 3770

字串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...