★实验任务
录入 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
", a[sum]);
else
printf("not,exist!
");
}
return 0;
}
其实通这题的哈希函数仔细一想还是比较容易想出来的,但是因为图方便我就没有多加思考,也没有深究map消耗时间等等的细节,以后还需要加以改正;