字串雜湊實質上就是把每個不同的字串轉成不同的整數
目的:判斷乙個字串是否出現過
1.自然溢位
利用unsigned long long的自然溢位:
當資料大於範圍時,會自動mod
(264−
1)mod (2^-1)
mod(26
4−1)
這樣就不用mod質數來保證唯一性了。
hash公式
has2.單hash法(作用不大,略過)h[i]
=has
h[i−
1]∗p
+id(
s[i]
)hash[i]=hash[i-1]*p+id(s[i])
hash[i
]=ha
sh[i
−1]∗
p+id
(s[i
])此處p要為質數。
3.雙hash法
對乙個字串用兩個不同的雜湊公式分別得到雜湊值。
這樣可以用乙個數對
sh1[
s],h
ash2
[s]>
sh1[
s],h
ash2
[s]>
來表示乙個字串的雜湊值。
hash公式
has
h1[i
]=(h
ash1
[i−1
])∗p
+id(
s[i]
)hash1[i]=(hash1[i−1])∗p+id(s[i]) % mod1
hash1[
i]=(
hash
1[i−
1])∗
p+id
(s[i
])h as
h2[i
]=(h
ash2
[i−1
])∗p
+id(
s[i]
)hash2[i]=(hash2[i−1])∗p+id(s[i]) % mod2
hash2[
i]=(
hash
2[i−
1])∗
p+id
(s[i
])大佬部落格附有一些可選素數
左為error率,右為可選素數
傳送門
#include
.h>
using namespace std;
#define maxn 202050
#define ll long long
int n,m,d;
typedef unsigned long long ull;
//#define _debug
ull a[maxn]
;ull base=
131;
int prime=
233317
;ull mod=
212370440130137957ll;
ull gethash
(string s)
intmain()
sort
(a+1
,a+1
+n);
int cnt=1;
for(
int i=
2;i<=n;i++
) cout<
}
作用:如果求出了乙個字串的hash值,那麼就可以o(1)求解字串雜湊值。公式:若已知乙個∣s∣
=n|s|=n
∣s∣=
n的字串的hash值.
h as
h[i]
,1<=i
<=n
hash[i],1<=i<=n
hash[i
],1<=i
<=n
,其子串sl,
....
,srsl,....,sr
sl,...
.,sr
,1
<=l
<=r
<=n
1<=l<=r<=n
1<=l
<=r
<=n
對應的hash值為
h as
h=((
hash
[r]−
hash
[l−1
]∗pr
−l+1
)%mo
d+mo
d)%m
odhash=((hash[r]-hash[l-1]*p^)\%mod+mod)\%mod
hash=(
(has
h[r]
−has
h[l−
1]∗p
r−l+
1)%m
od+m
od)%
mod傳送門
用了雙雜湊還有乙個模數。
(單雜湊取模也可)
不取模的話被卡65了。。
解決方法是取1e9左右的大素數作為模數。
用公尺勒羅蘋判素數即可找到乙個。
#include
.h>
using namespace std;
using ll = long long;
using ull=unsigned long long;
int n,m;
string t;
#define maxn 1000500
ull p=
1610612741
;ull q=
805306457
;const ll mod=
1000000223
;ull has[maxn]
;ull _has[maxn]
;ull sa[maxn]
;ull sb[maxn]
;void add
(string s)
for(
int i=
len+
1;i<
(int
)s.length()
;i++)}
intmain()
for(
int i=
1;icout<
}
一些簡單的Java字串練習題
1 字串轉化 壓縮 aabbccdaa a2b2c2d1a2 函式原型 public static string stringcompress string str 思路 首先把原字串由string型別轉換為stringbuilder型別,然後再呼叫stringbuilder類裡面的一些方法將原字串...
字串練習題
1.請編寫乙個c函式,該函式可以實現將乙個整數轉為任意進製的字串輸出 include include char ch 16 函式宣告 將整數轉換為任意進製的字串 charchar int2sys int num,int n,int move bit int main else if n 8 else...
字串練習題
變數名是否合法 1.變數名只能由字母 數字 下劃線組成 2.只能以字母或下劃線開頭 源 while true s input 變數名 if s exit print 歡迎下次使用 break if s 0 isalpha or s 0 for i in s 1 if not i.isalnum or...