演算法高階指南 Acwing 137 雪花雪花雪花

2021-10-03 14:27:58 字數 1455 閱讀 1875

有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

輸入樣例:

2

1 2 3 4 5 6

4 3 2 1 6 5

輸出樣例:

twin snowflakes found.
演算法: 字串的最小表示法
#include#include#includeusing namespace std;

int snow[6],isnow[6],snows[100010][6],idx[100010];

void get_min(int *a)else if (ss[i + k] < ss[j + k])

ans = min(i,j);

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

}bool cmp2(int* a,int* b)

return false;

}bool cmp1(int a,int b)

return false;

}int main()

get_min(snow);

get_min(isnow);

if (cmp2(snow,isnow))else

idx[i] = i;

}sort(idx,idx + n, cmp1);

for (int i = 1; i < n; ++i)

}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 雪花雪花雪花

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