iven 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.
Each input file contains one test case. For each test case, the first line contains a positive integer N (≤), 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.
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.
11
33 1 13 12 34 38 27 22 32 -1 21
1 13 12 21 33 34 38 27 22 32
考察hash的线性探测,和拓扑序列,题目大意:已知插入后的哈希表,求原插入顺序。
#include <iostream> #include <vector> #include <map> #include <set> using namespace std; map<int, set<int>> G; map<int, int> degree; int main() { int N, tmp, cnt = 0; scanf("%d", &N); vector<int> v(N), ans; for(int i = 0; i < N; i++) { scanf("%d", &v[i]); if(v[i] > 0) { degree[v[i]] = 0; // 入度设置为0 cnt++; } } for(int i = 0; i < N; i++) { if(v[i] > 0) { int tmp = v[i]; while(tmp % N != i) { G[v[tmp % N]].insert(v[i]); tmp++; degree[v[i]]++; } } } int index = 0; while(index != cnt) { int min; for(auto x: degree) { if(x.second == 0) { min = x.first; break; } } degree[min]--; for(auto x: G[min]) degree[x]--; ans.push_back(min); index++; } printf("%d", ans[0]); for(int i = 1; i < cnt; i++) printf(" %d", ans[i]); return 0; }
11-散列4 Hashing - Hard Version (30分)
原文:https://www.cnblogs.com/littlepage/p/12822359.html