hash求调
查看原帖
hash求调
808466
htdlz楼主2024/4/25 20:25

样例

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;
}
2024/4/25 20:25
加载中...