哈希(框架)
Description
索隆是有名的路痴,为了不让索隆走丢,娜美给了索隆一本地图。该地图有N个城市,编号从1到N。每个城
市有个代号,索隆每到一个城市只能知道该城市的代号而不知道该城市的编号,现有一份编号与代号对应的
清单,你能帮索隆尽快地找到所在城市的编号吗?
Input
输入第一行为两个正整数N (1< =N < =1000000),M(1<=M<=10000) 表示有N个城市,M个询问
接下来N行,每行一个整数ai(0<=ai<=100000000),第i行表示编号i的城市的代号为ai。这N个整数各不相同。
接下来M行,每行一个整数b(0<=b<=100000000),表示当前所在城市的代号。
Output
对于每个询问,输出一行一个整数,当前所在城市的编号,数据保证有解。
Sample Input
6 3
4
5
7
10
8
2
4
5
8
Sample Output
1
2
5
思路
#include<iostream>
using namespace std;
const int N = 200003;
int h[N];
int visit[N];
int Hash(int n)
{
return n % N;
}
void insert(int index, int n)
{
int k = Hash(n);
int i = 0;
while (visit[k] != 0 && visit[k] != n)
{
i++;
k = Hash(n + i * i);
}
visit[k] = n;
h[k] = index;
}
int search(int n)
{
int k = Hash(n);
int i = 0;
while (visit[k] != 0)
{
if (visit[k] == n)
{
return h[k];
}
i++;
k = Hash(n + i * i);
}
}
int main() {
int n, m;
cin >> n >> m;
//n个城市,m个询问
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
insert(i, x);
}
while (m--)
{
int x;
cin >> x;
int index = search(x);
if (index != -1)
{
cout <<index << endl;
}
else//保证有解就没必要了
{
cout << "error" << endl;
}
}
}