有n片雪花,每片雪花由六個角組成,每個角都有長度。
第i片雪花六個角的長度從某個角開始順時針依次記為ai,1,ai,2,…,ai,6ai,1,ai,2,…,ai,6。
因為雪花的形狀是封閉的環形,所以從任何乙個角開始順時針或逆時針往後記錄長度,得到的六元組都代表形狀相同的雪花。
例如ai,1,ai,2,…,ai,6ai,1,ai,2,…,ai,6和ai,2,ai,3,…,ai,6,ai,1ai,2,ai,3,…,ai,6,ai,1就是形狀相同的雪花。
ai,1,ai,2,…,ai,6ai,1,ai,2,…,ai,6和ai,6,ai,5,…,ai,1ai,6,ai,5,…,ai,1也是形狀相同的雪花。
我們稱兩片雪花形狀相同,當且僅當它們各自從某一角開始順時針或逆時針記錄長度,能得到兩個相同的六元組。
求這n片雪花中是否存在兩片形狀相同的雪花。
輸入格式
第一行輸入乙個整數n,代表雪花的數量。
接下來n行,每行描述一片雪花。
每行包含6個整數,分別代表雪花的六個角的長度(這六個數即為從雪花的隨機乙個角順時針或逆時針記錄長度得到)。
同行數值之間,用空格隔開。
輸出格式
如果不存在兩片形狀相同的雪花,則輸出:
no two snowflakes are alike.
如果存在兩片形狀相同的雪花,則輸出:
twin snowflakes found.
資料範圍
1≤n≤100000
0≤ai,j<100000000
輸入樣例:
2
1 2 3 4 5 6
4 3 2 1 6 5
輸出樣例:
twin snowflakes found.
題解: 定義雜湊 hash 函式 h(a[i] ) = (
#include #include #include #include #define swap(a,b) a ^= b ^= a ^= b
#define pi acos(-1)
#define cl(a,b) memset(a,b,sizeof(a))
using namespace std ;
const int max = 100010 ;
const int inf = 0x3f3f3f3f ;
int n ;
int tot ;
typedef long long ll ;
const int p = 1e9+7 ;
int snow[max][6] ;
int head[max] ;
int next[max] ;
ll h(int *a)
return (sum+mul)%p ;
}bool equal(int *a ,int *b )
}if(eq ) return 1 ;
for(int k = 0 ; k<6 ;k++ )
}if(eq) return 1 ;
} }}bool insert(int *a)
}// 沒有相同的就插入
++tot ;
memcpy(snow[tot],a,6*sizeof(int)) ;
next[tot] = head[val] ;
head[val] = tot ;
return 0 ;
}int main()
if(insert(a))
}puts("no two snowflakes are alike.") ;
return 0 ;
}
AcWing 137 雪花雪花雪花
題目描述 有n片雪花,每片雪花由六個角組成,每個角都有長度。第i片雪花六個角的長度從某個角開始順時針依次記為ai,1,ai,2,ai,6。因為雪花的形狀是封閉的環形,所以從任何乙個角開始順時針或逆時針往後記錄長度,得到的六元組都代表形狀相同的雪花。例如ai,1,ai,2,ai,6和ai,2,ai,3...
AcWing 137 雪花雪花雪花 初探hash
題目鏈結 本題的資料範圍顯然不能把所有陣列乙個乙個對比,可以建立乙個雜湊表,不同的h x 代表不同的雜湊值,雜湊值衝突的陣列就存在同乙個h x 開頭的煉表裡,然後根據雜湊值來對比對應的字串,減少重複比較。const int maxn 1e5 10 int a 10 snow maxn 6 h max...
演算法高階指南 Acwing 137 雪花雪花雪花
有n片雪花,每片雪花由六個角組成,每個角都有長度。第i片雪花六個角的長度從某個角開始順時針依次記為ai,1,ai,2,ai,6。因為雪花的形狀是封閉的環形,所以從任何乙個角開始順時針或逆時針往後記錄長度,得到的六元組都代表形狀相同的雪花。例如ai,1,ai,2,ai,6和ai,2,ai,3,ai,6...