【BZOJ 3067】Hyperdrome 哈希+状压

博客内容介绍了如何利用哈希和状态压缩技术解决BZOJ 3067问题。在内存有限的情况下,通过预处理合法状态,使用链表处理哈希冲突,并选择特定模数避免long long取模导致的问题。
摘要由CSDN通过智能技术生成

首先假设内存足够大的话可以用f[i]表示i这个状态出现了多少次,状态是指异或前缀和,那么根据题意,当且只有在i==0或者二进制表示下只有一个1的情况下是合法状态,所以每加一个字符,就更新当前前缀和,又由于A^B==C->A^C==B

那么可以预处理出所有合法状态,然后分别和当前状态异或后得到需要的状态,加入答案。

但是内存不够,不能用数组,amp貌似是一个不错的选择,呵呵,又T又mle,那么hash好了,呵呵,冲突太多,所以正解是用一个链表来处理所有的冲突,汗。。。

然后到底hash的时候取模多少呢?好像只要是一个不爆内存的数就好了,呵呵,卡long long取模,解决办法是选8388607因为它的二进制数是11111111111111111111111就可以用&来代替%了,嗯,我服

但是代码并不长

#include<cstdio>
#include<cstring>
#include<iostream>
#define Mod 8388607
#define maxn 3*100021
using namespace std;
typedef long l
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值