知识点:散列
这个题是整数的散列,用的方法是深入浅出程序设计竞赛上面看的,用vector模拟的邻接表,然后每个雪花的hash值采用的是6个数的和,模采用了10007和233333都试了试,时间差不多,然后让雪花和它对应的hash值的那一列里面的雪花进行比较,没有找到相同的那么插入,找到相同的更新答案,
看了看李煜东的hash值是6个数的和与6个数的乘积的和,没有看他的写,最后速度慢了不到一倍,
#include <bits/stdc++.h>
using namespace std;
const int Mod = 100007;
int ok = 1;
vector<int> a;
vector<vector<int>> v[Mod + 5];
void solve() {
int sum = 0;
for (int i = 0; i < 6; i++) sum += a[i];
for (int i = 0; i < (int) v[sum % Mod].size(); i++) {
vector<int> tmp = v[sum % Mod][i];
int jug = 0;
for (int i = 0; i < 6; i++) {
int flag = 1;
for (int j = 0; j < 6; j++) {
if (a[j] != tmp[(j + i) % 6]) flag = 0;
}
if (flag) jug = 1;
}
if (jug) { ok = 0; return; }
reverse(a.begin(), a.end());
for (int i = 0; i < 6; i++) {
int flag = 1;
for (int j = 0; j < 6; j++) {
if (a[j] != tmp[(j + i) % 6]) flag = 0;
}
if (flag) jug = 1;
}
if (jug) { ok = 0; return; }
}
v[sum % Mod].push_back(a);
}
int main() {
int t;
cin >> t;
while (t--) {
a.clear();
for (int i = 0; i < 6; i++) {
int x;
cin >> x;
a.push_back(x);
}
if (ok) solve();
}
cout << (ok ? "No two snowflakes are alike." : "Twin snowflakes found.");
return 0;
}