zoukankan      html  css  js  c++  java
  • PAT甲级1078 Hashing【hash】

    题目https://pintia.cn/problem-sets/994805342720868352/problems/994805389634158592

    题意:

    给定哈希表的大小和n个数,使用平方探测法解决冲突,为每个数在哈希表中的位置。

    如果给定的哈希表的大小不是质数,将其改为最小的比他大的质数。

    思路:

    比较基础的题目。有两个要注意的点!

    1、初始化notprime数组时,需要注意1,也不是质数。特殊处理notprime[1] = true

    2、注意考虑prob的边界,应该是哈希表的大小。

      因为对于$prob > msize$,设$prob = msize + i$, 则$prob^2 = msize^2 + 2{msize}{i}+i^2$

      根据同余$prob^2%msize = i^2%msize$

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<map>
     4 #include<set>
     5 #include<iostream>
     6 #include<cstring>
     7 #include<algorithm>
     8 #include<vector>
     9 #include<cmath> 
    10 #include<stack>
    11 #include<queue>
    12 
    13 #define inf 0x7fffffff
    14 using namespace std;
    15 typedef long long LL;
    16 typedef pair<string, string> pr;
    17 
    18 int msize, n;
    19 const int maxn = 1e4 + 5;
    20 int notprime[maxn * 10];
    21 
    22 void init()
    23 {
    24     notprime[1] = true;
    25     int now = 2;
    26     while(now < 1e5){
    27         if(!notprime[now]){
    28             int tmp = now + now;
    29             while(tmp < 1e5){
    30                 notprime[tmp] = true;
    31                 tmp += now;
    32             }
    33         }
    34         now++;
    35     }
    36 }
    37 
    38 int h[maxn];
    39 int pos[maxn];
    40 
    41 int main()
    42 {
    43     init();
    44     scanf("%d%d", &msize, &n);
    45     while(notprime[msize]){
    46         msize++;
    47     }
    48     for(int i = 0; i < n; i++){
    49         int v;
    50         scanf("%d", &v);
    51         int p = v % msize, prob = 0;
    52         while(h[(p + prob * prob) % msize] && prob < msize){
    53             prob++;
    54         }
    55         if(h[(p + prob * prob) % msize]){
    56             pos[i] = -1;
    57         }
    58         else{
    59             h[(p + prob * prob) % msize] = v;
    60             pos[i] = (p + prob * prob) % msize;
    61         }
    62     }
    63     
    64     if(pos[0] == -1){
    65         printf("-");
    66     }
    67     else{
    68         printf("%d", pos[0]);
    69     }
    70     for(int i = 1; i < n; i++){
    71         if(pos[i] == -1){
    72             printf(" -");
    73         }
    74         else{
    75             printf(" %d", pos[i]);
    76         }
    77     }
    78     printf("
    ");
    79     
    80     return 0;
    81 }
  • 相关阅读:
    dex文件格式三
    神庙逃亡破解分析
    MySQL优化
    Redis AOF和RDB
    KD树
    关系型和非关系型数据库
    数据库实现分布式锁
    单点登录
    数据库树形结构查询
    层次遍历递归和非递归方法
  • 原文地址:https://www.cnblogs.com/wyboooo/p/10656407.html
Copyright © 2011-2022 走看看