字串雜湊,說白了就是乙個函式,你把乙個字串輸入進去處理,輸出乙個更容易儲存或者比較的東西,相當於乙個加密的過程。但是對於同乙個加密方法,可能會有不同字串得到同樣的結果的情況,所以我們要做的就是讓字串的雜湊值盡量不相等。
一般我們現在接觸到的字串雜湊,基本思想就是把它的每一位轉化成乙個特殊進製數的乙個數字,這個大數可能會很大,如果我們直接比較大數,這就和直接比較字串沒什麼區別。
我們認為,對雜湊值這個大數取模,認為他與原來等效(在一定的錯誤率的情況下)。
單模數雜湊
#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位的雜湊...