问题 A: 哈希
问题 A: 哈希
时间限制: 1 Sec 内存限制: 128 MB
提交: 37 解决: 18
[提交][状态][讨论版][命题人:外部导入][Edit] [TestData]
题目链接:http://acm.ocrosoft.com/problem.php?cid=1716&pid=0
题目描述
在数据结构中,我们学过哈希表。我们知道,哈希存储方法是一种根据关键码值(Key value)而直接进行访问的数据结构方法。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数H(key),存放记录的数组叫做哈希表。
在哈希表的构造中,哈希函数的选取显得异常重要。比如,在存储一个班级所有学生的某一门学科成绩的时候(假设该班人数<100),每个学生的学号有10~12位,我们不可能开出这么大的数组来储存,由于每个学生的学号末2位均不相同,我们可以开一个大小为100的数组,假设一个同学的学号为090104100151,那么,我们可以将该同学的成绩记录在下标为51数组元素中。这里我们用到的哈希方法叫做除留余数法,即H(key)=key % p(此处的p为100)。但是,这种哈希函数经常会产生冲突,即对于key1!=key2,却有H(key1)==H(key2)。现给定p以及n个关键码(key),问:按这种哈希函数对着n个关键码进行映射,是否有冲突。
输入
输入文件中包含多个测试数据。每个测试数据占两行。每个测试数据的第一行为2个数p和n,第二行为n个关键码。其中p和n为不大于10000的正整数,其它的数均为不大于10000000的正整数。
最后一行为0 0,表示输入结束。
输出
对于每个测试数据,如果存在冲突,则输出"Conflict",否则输出"All right"。
样例输入
100 3
1002 1103 2111
13 5
2 3 5 13 15
0 0
样例输出
All right
Conflict
思路:题目叫哈希,我也不知道这个和哈希有啥关系,可能是告诉你某种哈希入门的思想吧,直接map一弄就好了。代码:
#include<bits/stdc++.h>
using namespace std;
map<int, int>sxw;
int main()
{
int p, n;
while (cin >> p >> n && p != 0 && n != 0)
{
int fla = 0;
sxw.clear();
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
if (sxw[x%p])//说明之前已经出现过这个学号了
{
fla = 1;//标记
}
sxw[x%p] = 1;
}
if (fla == 0)
{
cout << "All right" << endl;
}
else cout << "Conflict" << endl;
}
}