欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PAT(A)1078 Hashing (25分)(模拟哈希表,二次查找防重复)

程序员文章站 2022-07-08 22:20:36
...

PAT(A)1078 Hashing (25分)(模拟哈希表,二次查找防重复)

Sample Input

4 4
10 6 4 15

Sample Output

0 1 4 -

思路:
首先给n与m,n表示表长,m表示输入的数字个数,模拟哈希表输出插入位置,如果没有就输出-。
直接模拟,我最后一个点一直过不了,后来发现题目不清,要用二次查找防冲突。
然后,????了。
代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <string>
#include <map>

using namespace std;

typedef long long ll;

ll n, m;
ll a[10004];
map<ll, ll>mp;

bool Prime(ll a)
{
    if (a == 1) return 0;
    if (a == 2) return 1;
    for (ll i = 2; i * i <= a; ++i)
    {
        if (!(a % i))
            return 0;
    }
    return 1;
}

int main()
{
    scanf("%lld %lld", &n, &m);

    for (ll i = 0; i < m; ++i)
        scanf("%lld", &a[i]);
    ll num = n;
    while (!Prime(n))
        n++;
    int f = 0;
    for (ll i = 0; i < m; ++i)
    {
        ll j = 0;
        for (j = 0; j <= num; ++j)
        {
            if (mp[(a[i] + j * j) % n] != 1)
            {
                mp[(a[i] + j * j) % n] = 1;
                if (f == 0)
                {
                    f = 1;
                    printf("%lld", (a[i] + j * j) % n);
                }
                else
                    printf(" %lld", (a[i] + j * j) % n);
                break;
            }
        }
        if (j == num + 1)
            printf(" -");
    }

    // getchar(); getchar();
    return 0;
}