1078 Hashing (25 分)
题目传送门:1078 Hashing (25 分)
一、题目大意
将给定长度为n的数组放到长度为M的哈希表中,如果M不是素数,则将M往后扩大到M后面的第一个素数。
在哈希时如果冲突,则二次探测再散列。刚开始没注意这一句:Quadratic probing (with positive increments only) is used to solve the collisions.,以至于最后一组数据一直过不了。
二、解题思路
将M扩增到大于等于的M的最小素数不难,难点是不知道什么是哈希表二次探测再散列,我百度后才知道,其实就是当将key往哈希表中存的时候,当发现key%M这一位已经存放了别的数了,那再放key就会产生冲突,那么我们该怎么解决冲突呢,就是二次探测,就是依次看(key±i^2)%M是否存放数,i是从1到M-1,如果遇到一个未存放数的哈希位置,我们就把key放到放到(key±i^2)%M这个位置上即可。
三、AC代码
#include<bits/stdc++.h>
using namespace std;
vector<int>P{
2};
void init(int n){
//滚动数组产生素数表
for(int i = P.back()+1; i <= n; i+=2){
bool f = true;
for(auto j: P){