Given a hash table of size N, we can define a hash function . 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
拓扑排序+哈希表
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
struct node
{
int x,y;
node(int a,int b):x(a),y(b){}
};
int main()
{
int n;
cin>>n;
int *Hash=new int[n];
int *Degree=new int[n];
vector<vector<int> > G(n);
vector<int>ans;
for(int i=0;i<n;i++)
{
cin>>Hash[i];
if(Hash[i]>=0)
Degree[i]=0;
else
Degree[i]=-1;
}
for(int i=0;i<n;i++)
{
if(Hash[i]<0)
continue;
int now=i;
int hashcode=Hash[i]%n;
Degree[i]=(now-hashcode+n)%n;
for(int s=0;s<Degree[i];s++)
{
G[(hashcode+s+n)%n].push_back(i);
}
}
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >Q;
for(int i=0;i<n;i++)
{
if(Degree[i]==0)
{
Q.push(pair<int,int>(Hash[i],i));
}
}
while(!Q.empty())
{
pair<int,int> p=Q.top();
int V=p.second;
ans.push_back(p.first);
Q.pop();
for(int i=0;i<G[V].size();i++)
if(--Degree[G[V][i]]==0)
Q.push(pair<int,int>(Hash[G[V][i]],G[V][i]));
}
cout<<ans[0];
for(int i=1;i<ans.size();i++)
cout<<" "<<ans[i];
return 0;
}