POJ 3349 Hash 最小表示法

2021-10-03 14:42:38 字數 1621 閱讀 7535

題意

傳送門 poj 3349

題解每朵雪花有 12

1212

種排序,直接 o(n

2)

o(n^2)

o(n2

) 比較複雜度過高。建立 has

hhash

hash

表,將 n

nn 朵雪花一次插入,掃瞄其雜湊值對應的鍊錶,檢查是否存在與其相等的雪花即可。

考慮到雪花迴圈同構,設雪花角的個數為 l

ll,直接比較 2

22 朵雪花複雜 o(l

3)

o(l^3)

o(l3

)。將其 o(l

)o(l)

o(l)

預處理為最小表示法,就可以在雜湊衝突時 o(l

)o(l)

o(l)

檢查 2

22 朵雪花是否相等。

定義雜湊函式為 h(a

0,a1

,…,a

5)=[

∑i=0

5(ai

+ri)

+∏i=

05(a

i+ri

)]mo

dp

h(a_0,a_1,\dots,a_5)=[\sum\limits_^(a_i+r_i)+\prod\limits_^(a_i+r_i)]\mod p

h(a0​,

a1​,

…,a5

​)=[

i=0∑

5​(a

i​+r

i​)+

i=0∏

5​(a

i​+r

i​)]

modp

,其中 ai,

ri

a_i,r_i

ai​,ri

​ 為雪花順時針、逆時針各角的長度的最小表示法。顯然,若兩朵雪花相等,其六個角的在最小表示法下順序確定且相等,其長度之和、長度之積都相等。

#include

#include

#include

using

namespace std;

const

int maxn =

100005

, mod =

99991

;struct snow

s[maxn]

;int n, tot, head[maxn]

, nxt[maxn]

;int

hash

(snow &x)

voidop(

int*a,

int*s)

int p =

min(i, j)

;memcpy

(s, b + p,

sizeof

(int)*

6);}

bool

equa

(snow &a, snow &b)

bool

insert

(int

*a)int

main()

}puts

("no two snowflakes are alike.");

return0;

}

3349 hash 鍊錶

題意為判斷是後有相同的雪花,雪花的花瓣可能是順時針,或逆時針描述,故對hash值相同的還要進行比較,相同則推出,否則把該雪花加到該hash對應的鍊錶上 code 時間複雜度還是太高了 include using namespacestd structnode hash 150006 intfac i...

POJ 3349 第一道雜湊

題目在 其實在面試中雜湊表是經常被問到的乙個題目,不過實戰程式設計中運用的卻很少,因為很少有效率瓶頸。這個題目就一道典型的可以用雜湊表可以加速的題目。題目大意 每片雪花有 6 個角長度的值,對於不同的雪花而言,這些值可能被反轉,並且開頭的長度未必是一致的 例如 1 2 3 4 5 6和 4 3 2 ...

雜湊(hash 之 開放位址法(poj)

include includeusing namespace std const int size 20345677 const int m 1000000000 const int key 1357 typedef struct hash hash hash hash size 線性探測再雜湊,為...