題意
傳送門 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 線性探測再雜湊,為...