137 雪花雪花雪花 hash

2021-09-25 06:12:27 字數 1780 閱讀 5072

有n片雪花,每片雪花由六個角組成,每個角都有長度。

第i片雪花六個角的長度從某個角開始順時針依次記為ai,1,ai,2,…,ai,6

因為雪花的形狀是封閉的環形,所以從任何乙個角開始順時針或逆時針往後記錄長度,得到的六元組都代表形狀相同的雪花。

例如ai,1,ai,2,…,ai,6

和ai,2,ai,3,…,ai,6,ai,1

就是形狀相同的雪花。

ai,1,ai,2,…,ai,6

和ai,6,ai,5,…,ai,1

也是形狀相同的雪花。

我們稱兩片雪花形狀相同,當且僅當它們各自從某一角開始順時針或逆時針記錄長度,能得到兩個相同的六元組。

求這n片雪花中是否存在兩片形狀相同的雪花。

輸入格式

第一行輸入乙個整數n,代表雪花的數量。

接下來n行,每行描述一片雪花。

每行包含6個整數,分別代表雪花的六個角的長度(這六個數即為從雪花的隨機乙個角順時針或逆時針記錄長度得到)。

同行數值之間,用空格隔開。

輸出格式

如果不存在兩片形狀相同的雪花,則輸出:

no two snowflakes are alike.

如果存在兩片形狀相同的雪花,則輸出:

twin snowflakes found.

資料範圍

1≤n≤100000

,0≤ai,j<10000000

輸入樣例:

21 2 3 4 5 6

4 3 2 1 6 5

輸出樣例:

twin snowflakes found.

分析:這個題目我們可以將具有相同特徵的雪花儲存在乙個鄰接表中。

那麼這道題目,我們可以採用雪花長度之和+雪花長度之積 並取於p。作為每個雪花的特徵值。然後比較相同特徵值的雪花是否完全一樣即可。

在比較是否完全一樣的時候,一定不要排序之後再比較。

看這組資料:

21 2 3 4 5 6

4 2 3 1 6 5

可以得出排序之後再比較的思想是錯誤的。

#include"stdio.h"

#include"string.h"

#include"vector"

#include"algorithm"

using namespace std;

#define p 99991

typedef long long ll;

int n;

ll a[100100][8];

vectorq[99993];

int euqul(int x,int y)

if(k == 6) return 1;

}for(int i = 0;i <= 5; i ++)

if(k == 6) return 1;

}return 0;

}int main()

if(mark == 1)

continue;

s += s1;

s1 = s % (ll)p;

for(int j = 0; j < q[s1].size(); j ++)

if(euqul(i,q[s1][j]))

if(mark == 0)

q[s1].push_back(i);

}if(mark == 1)

printf("twin snowflakes found.\n");

else

printf("no two snowflakes are alike.\n");

}

AcWing 137 雪花雪花雪花

題目描述 有n片雪花,每片雪花由六個角組成,每個角都有長度。第i片雪花六個角的長度從某個角開始順時針依次記為ai,1,ai,2,ai,6。因為雪花的形狀是封閉的環形,所以從任何乙個角開始順時針或逆時針往後記錄長度,得到的六元組都代表形狀相同的雪花。例如ai,1,ai,2,ai,6和ai,2,ai,3...

Acwing 137 雪花雪花雪花

有n片雪花,每片雪花由六個角組成,每個角都有長度。第i片雪花六個角的長度從某個角開始順時針依次記為ai,1,ai,2,ai,6ai,1,ai,2,ai,6。因為雪花的形狀是封閉的環形,所以從任何乙個角開始順時針或逆時針往後記錄長度,得到的六元組都代表形狀相同的雪花。例如ai,1,ai,2,ai,6a...

AcWing 137 雪花雪花雪花 初探hash

題目鏈結 本題的資料範圍顯然不能把所有陣列乙個乙個對比,可以建立乙個雜湊表,不同的h x 代表不同的雜湊值,雜湊值衝突的陣列就存在同乙個h x 開頭的煉表裡,然後根據雜湊值來對比對應的字串,減少重複比較。const int maxn 1e5 10 int a 10 snow maxn 6 h max...