哈希(框架)

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;
		}
	}
}
posted @ 2024-11-06 11:34  某朝  阅读(19)  评论(0编辑  收藏  举报