11-散列4 Hashing - Hard Version (30 分)
Given a hash table of size N, we can define a hash function H(x)=x%N. Suppose that the linear probing is used to solve collisions, we can easily obtain the status of the hash table with a given sequence of input numbers.
However, now you are asked to solve the reversed problem: reconstruct the input sequence from the given status of the hash table. Whenever there are multiple choices, the smallest number is always taken.
Input Specification:
Each input file contains one test case. For each test case, the first line contains a positive integer N (≤1000), which is the size of the hash table. The next line contains N integers, separated by a space. A negative integer represents an empty cell in the hash table. It is guaranteed that all the non-negative integers are distinct in the table.
Output Specification:
For each test case, print a line that contains the input sequence, with the numbers separated by a space. Notice that there must be no extra space at the end of each line.
Sample Input:
11
33 1 13 12 34 38 27 22 32 -1 21结尾无空行
Sample Output:
1 13 12 21 33 34 38 27 22 32
结尾无空行
Code:
#include <bits/stdc++.h>
#include <cmath>
#define mem(a, b) memset(a, b, sizeof a)
#define ssclr(ss) ss.clear(), ss.str("")
#define INF 0x3f3f3f3f
#define MOD 1000000007
using namespace std;
typedef long long ll;
const int maxn = 1009;
int n;
int ha[maxn], in[maxn], g[maxn][maxn];
unordered_map<int, int> ump, id;
vector<int> vec;
priority_queue<int, vector<int>, greater<int>> pq;
void topo()
{
for (int i = 1; i <= n; i++)
if (in[i] == 0 && ump[i] >= 0)
pq.push(ump[i]); // avoid 负数的情况
while (!pq.empty())
{
int tp = pq.top();
pq.pop();
vec.push_back(tp);
for (int i = 1; i <= n; i++)
if (g[id[tp]][i] && --in[i] == 0)
pq.push(ump[i]);
}
}
int main()
{
int num, p, pos;
scanf("%d", &n);
p = n;
for (int i = 1; i <= n; i++)
{
scanf("%d", &num);
ump[i] = num;
id[num] = i;
ha[i - 1] = i;
}
for (int i = 1; i <= n; i++)
{
if (ump[i] < 0)
continue;
for (int j = 0;; j++)
{
pos = (ump[i] + j) % p;
if (ha[pos] == i || ump[ha[pos]] < 0)
break;
g[ha[pos]][i] = 1;
in[i]++;
}
}
topo();
for (int i = 0; i < vec.size(); i++)
printf("%d%c", vec[i], i == vec.size() - 1 ? '\n' : ' ');
return 0;
}