5.散列-字符串hash-课后练习题


题目:给出N个字符串(由三个大写字母组成)再给出M个查询字符串,问其在A中的出现的次数?(N,M<100)

自己思考一下:
<mark>N数组可以使用 char N [times] [3] 二维数组 也可以 使用c++的 string 数组</mark>
<mark>但是M数组只是查询不需要存储 故只需要一个一维数组,循环读入输出即可。</mark>

#include <bits/stdc++.h>
using namespace std;
int hashlist[26*26*26+10];  //用来存储和计数 
char N[100][5],M[5];
int hash(char s[],int len)  //hash转换函数 将字符串转成数字 
{
	int id=0;
	for(int i=0;i<len;i++) 
	{
		id=id*26+(s[i]-'A');
	}
	return id;
} 
int main()
{
	
	int n,m;
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
		cin>>N[i];
		int id=hash(N[i],3);    //字符串转成数字 
		hashlist[id]++;   //该字符串出现一次+1 
	} 
	for(int i=0;i<m;i++)
	{
		cin>>M;
		int id=hash(M,3);    //字符串转成数字 
		cout<<hashlist[id]<<endl;
		
	}
	return 0;
}