样例
1.
input
2
1 2 3 4 5 6
4 3 2 1 6 5
output
Twin snowflakes found.
2.
input
2
1000 1000 1000 1000 1000 999
999 1000 1000 1000 1000 1000
output
Twin snowflakes found.
3.
input
1
12 12 12 12 12 12
output
No two snowflakes are alike.
码
#include <bits/stdc++.h>
//#define MOD 63 * 83 * 13
#define MOD 99991
using namespace std;
set < int > head;
vector < int* > hs[1000005];
int a[10], snow[1000005][10];
bool fd(int* x, int* y) {
for (int i = 1; i <= 6; i++) {
for (int j = 1; j <= 6; j++) {
int flag = 1;
for (int k = 1; k <= 6; k++) {
if (x[(i + k) % 6] != y[(j + k) % 6]) flag = 0;
}
if (flag) return 1;
flag = 1;
for (int k = 1; k <= 6; k++) {
if (x[(i + k) % 6] != y[(j + 6 - k) % 6]) flag = 0;
}
if (flag) return 1;
}
}
return 0;
}
bool HS() {
long long sum = 0, ch = 1;
for (int i = 1; i <= 6; i++) {
sum += a[i];
ch *= a[i];
sum %= MOD;
ch %= MOD;
}
sum += ch;
sum %= MOD;
if (head.find(sum) != head.end()) {
for (auto it : hs[sum]) {
if (fd(it, a)) return 1;
}
}
head.insert(sum);
memcpy(snow[sum], a, 6 * sizeof(int));
hs[sum].push_back(a);
return 0;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= 6; j++) {
cin >> a[j];
}
if (HS()) {
cout << "Twin snowflakes found.\n";
return 0;
}
}
cout << "No two snowflakes are alike.\n";
return 0;
}