多元组hash表spoj-twinsnow-snowflakes

博客探讨了一种错误但能通过部分数据的多元组哈希判重方法,涉及多重hash和重定义size_t。尽管思路有误,代码依然能够解决一些简单情况。文中提到了unordered_map的不同实现,如gp_hash_table和cc_hash_table,并指出该问题更适合使用最小表示法来解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多元组的哈希判重

题目链接

这里提供一种错误的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");
}

其中unordered_map:

在这里插入图片描述

gp_hash_table(探测):

在这里插入图片描述

cc_hash_table(拉链)

在这里插入图片描述

其实这题应该用最小表示法,以后补坑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值