字串雜湊學習入門 一些練習題目

2021-10-09 04:14:27 字數 3470 閱讀 7587

字串雜湊實質上就是把每個不同的字串轉成不同的整數

目的:判斷乙個字串是否出現過

1.自然溢位

利用unsigned long long的自然溢位:

當資料大於範圍時,會自動mod

(264−

1)mod (2^-1)

mod(26

4−1)

這樣就不用mod質數來保證唯一性了。

hash公式

has

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要為質數。

2.單hash法(作用不大,略過)

3.雙hash法

對乙個字串用兩個不同的雜湊公式分別得到雜湊值。

這樣可以用乙個數對

sh1[

s],h

ash2

[s]>

sh1[

s],h

ash2

[s]>

來表示乙個字串的雜湊值。

hash公式

h
as

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