PAT(A)1078 Hashing (25分)(模拟哈希表,二次查找防重复)
程序员文章站
2022-07-08 22:20:36
...
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;
}