成绩查询(哈希函数)

★实验任务

录入 n 个学生的成绩,并查询。

★数据输入

第一行输入包括 n、m(1<=n<=50,000,1<=m<=100,000)两个数字。
接下来 n 行,每行包含名字和成绩,名字用字符串表示,长度不超过 4.成绩为不 超过 100 的非负整数,名字仅由小写字母组成。
接下来 m 行,每行包括一个名字。

★数据输出

输出 m 行,如果查询的学生不存在,输出”not,exist!”,否则输出学生的成绩。

解题思路:因为之前看到这题首先想的就是直接用STl中的map就可以实现(根本就没想不能全AC),就没有深入想怎么用哈希函数实现。之后就看了一下同学的评优代码,我选择了一份感觉比较简短的代码,就是直接通过对字符串不同位置进行ASCII码转换的一个哈希函数。

代码:

 
            #include<stdio.h>
#include<cmath>
#include<iostream>
#include<string>

using namespace std;
int a[500001];
int main()
{
	int i, n, m, x, j, sum, len;
	string s;
	memset(a, -1, sizeof(a));
	cin >> n >> m;
	for (i = 1; i <= n; i++)
	{
		cin >> s >> x;
		len = s.length();
		sum = s[0] - 'a' + 1;
		for (j = 1; j<len; j++)
		{
			sum = sum * 26 + (s[j] - 'a' + 1);
		}
		a[sum] = x;
	}
	for (i = 1; i <= m; i++)
	{
		cin >> s;
		len = s.length();
		sum = s[0] - 'a' + 1;
		for (j = 1; j<len; j++)
		{
			sum = sum * 26 + (s[j] - 'a' + 1);
		}
		if (a[sum] >= 0)
			printf("%d\n", a[sum]);
		else
			printf("not,exist!\n");
	}

	return 0;
}
        

其实通这题的哈希函数仔细一想还是比较容易想出来的,但是因为图方便我就没有多加思考,也没有深究map消耗时间等等的细节,以后还需要加以改正;

posted @ 2017-11-20 20:55  heihuifei  阅读(378)  评论(0编辑  收藏  举报