模板 字串雜湊

2021-10-03 13:25:18 字數 1984 閱讀 3769

字串雜湊,說白了就是乙個函式,你把乙個字串輸入進去處理,輸出乙個更容易儲存或者比較的東西,相當於乙個加密的過程。但是對於同乙個加密方法,可能會有不同字串得到同樣的結果的情況,所以我們要做的就是讓字串的雜湊值盡量不相等。

一般我們現在接觸到的字串雜湊,基本思想就是把它的每一位轉化成乙個特殊進製數的乙個數字,這個大數可能會很大,如果我們直接比較大數,這就和直接比較字串沒什麼區別。

我們認為,對雜湊值這個大數取模,認為他與原來等效(在一定的錯誤率的情況下)。

單模數雜湊

#include

using

namespace std;

const

int n=

1e4+5;

const

int inf=

0x7fffffff

;const

int mod=

1e9+7;

typedef

long

long ll;

#define fi first

#define se second

#define mp make_pair

#define pii pair

//#define int long long

#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

#define endl '\n'

int a[n]

;int

hashs

(string s)

return sum;

}signed

main()

int cnt=0;

sort

(a+1

,a+n+1)

;for

(int i=

1;i<=n;i++

) cout<}

雙模數雜湊(準確度更高但是更耗費時間)

#include

using

namespace std;

const

int n=

1e4+5;

const

int inf=

0x7fffffff

;const

int mod1=

1e9+7;

const

int mod2=

1e8+7;

typedef

long

long ll;

#define fi first

#define se second

#define mp make_pair

#define pii pair

//#define int long long

#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

#define endl '\n'

struct node

}a[n]

;int

hashs1

(string s)

return sum;

}int

hashs2

(string s)

return sum;

}bool

cmp(node a,node b)

signed

main()

int cnt=0;

sort

(a+1

,a+n+

1,cmp)

;for

(int i=

1;i<=n;i++

) cout<}

還有一種自然溢位發,就是用unsigened long long ,當這個雜湊值溢位,他就會自己對2的64次方取模(比較偷懶,但是只能在出題人比較良心的情況下用 ,感興趣的話csdn吧)

字串雜湊 模板

以下文字 據我的理解,hash就是乙個像函式一樣的東西,你放進去乙個值,它給你輸出來乙個值。輸出的值就是hash值。一般hash值會比原來的值更好儲存 更小 或比較。那字串hash就非常好理解了。就是把字串轉換成乙個整數的函式。而且要盡量做到使字串對應唯一的hash值。字串hash的種類還是有很多種...

模板 字串雜湊

如題,給定n個字串 第i個字串長度為mi,字串內包含數字 大小寫字母,大小寫敏感 請求出n個字串中共有多少個不同的字串。第一行包含乙個整數n,為字串的個數。接下來n行每行包含乙個字串,為所提供的字串。輸出包含一行,包含乙個整數,為不同的字串個數。s am plei nput sample input...

字串雜湊(模板)

尋找長度為n的主串s中的匹配串t 長度為m 出現的位置或次數屬於字串匹配問題。字串雜湊就是將每個字串轉化為乙個數值,然後遍歷主串,判斷在主串起始位置為i長度為m的字串的雜湊值與匹配串的雜湊值是否相等即可,每次判斷為o 1 的時間。這樣就可以轉化為o n 的時間完成判斷。若求字串中第i位到第j位的雜湊...