题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805389634158592
注意点:二次探查法的边界是tsize,step = tsize的时候就是查找失败的时候。
代码部分
#include<algorithm>#include<vector>#include<iostream>using namespace std;const int maxn = 100010;vector<bool> is_prime(maxn, true);void get_prime(){is_prime[1] = false;for(int i = 2; i < maxn; i++){if(is_prime[i]){for(int j = 2 * i; j < maxn; j += i){is_prime[j] = false;}}}}int main(){int tsize, n, temp;get_prime();scanf("%d%d", &tsize, &n);//更新tsizeif(is_prime[tsize] == false){//如果不是素数for(int i = tsize; i < maxn; i++){if(is_prime[i]) {tsize = i;break;}}}vector<int> hashtable(tsize, -1);for(int i = 0; i < n; i++){scanf("%d",&temp);if(hashtable[temp % tsize] == -1){hashtable[temp % tsize] = temp;printf("%d", temp % tsize);} else {int step = 1;while(step < tsize){if(hashtable[(temp + step * step) % tsize] == -1){hashtable[(temp + step * step) % tsize] = temp;printf("%d",(temp + step * step) % tsize);break;} else step++;}if(step == tsize) printf("-");}if(i != n - 1) printf(" ");}return 0;}
