多元组的哈希判重
这里提供一种错误的ac代码
虽然思路错了但是还是a了数据很水的这题
我原本就想,针对每个不同的六元组,维护两个int,分别表示六元组的积、和,然后用hash存pair判重,这样做是不严谨的----没有判断雪花的顺序,但是它居然ac了。虽然我运气挺好但是实现这些多元组的hash还是遇到了一些曲折的
##下面介绍两种实现多元组的方法;
法1—多重hash
#include<bits/stdc++.h>
#include<bits/extc++.h>
#define oo INT_MAX
#define ll long long
#define mp(a, b) make_pair(a, b)
#define _rep(i, a, b) for(int i = (a); i <= (b); ++i)
#define _for(i, a, b) for(int i = (a); i < (b) ;++i)
using namespace std;
using namespace __gnu_pbds;
using Gp_hash = gp_hash_table<int, gp_hash_table<int, bool> >;
Gp_hash q;
int n;
int main(){
ios::sync_with_stdio(0);
cin >> n;
bool flag = 1;
_rep(i, 1, n){
ll a = 0, b = 1;
_rep(i, 1, 6){
ll tmp;
cin >> tmp;
a += tmp;
b *= tmp;
}
if(!q[a][b])q[a][b] = 1;
else {
flag = 0;
break;
}
}
puts(flag ? "No two snowflakes are alike.":"Twin snowflakes found.");
system("pause");
}
法2-----重定义size_t
#include<bits/stdc++.h>
#include<bits/extc++.h>
#define oo INT_MAX
#define ll long long
#define mp(a, b) make_pair(a, b)
#define _rep(i, a, b) for(int i = (a); i <= (b); ++i)
#define _for(i, a, b) for(int i = (a); i < (b) ;++i)
using namespace std;
using namespace __gnu_pbds;
inline size_t key(int i, int j) {return (size_t)i << 32 | (unsigned int) j; }
unordered_map <size_t , bool> q;
int n;
int main(){
ios::sync_with_stdio(0);
cin >> n;
bool flag = 1;
_rep(i, 1, n){
ll a = 0, b = 1;
_rep(i, 1, 6){
ll tmp;
cin >> tmp;
a += tmp;
b *= tmp;
}
if(!q[key(a, b)])q[key(a, b)] = 1;
else {
flag = 0;
break;
}
}
puts(flag ? "No two snowflakes are alike.":"Twin snowflakes found.");
system("pause");
}