散列是常用的算法之一,在很多程序中都会用到。
比如给出N个正整数和M个正整数,问M是否在N个数中出现过,N,M<=10^5,所有正整数不超过10^5;
输入:
5 3
8 3 7 6 2
7 4 2
输出:
7 2
#include<stdio.h>
const int maxn=100010;
bool hashTable[maxn];
int main()
{
int n,m,x;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d",&x);
hashTable[x]=true;
}
for(int i=0;i<m;i++)
{
scanf("%d",&x);
if(hashTable[x]==true)
{
printf("%d ",x);
}
}
return 0;
}
如果要求查询每个数在N个数中出现的次数则主要将bool hashTable[maxn];改为int hashTable[maxn]={0};再做数量上的累加即可。
#include<stdio.h>
const int maxn=100010;
int hashTable[maxn]={0};
int main()
{
int n,m,x;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d",&x);
hashTable[x]++;
}
for(int i=0;i<m;i++)
{
scanf("%d",&x);
if(hashTable[x]!=0)
{
printf("%d %d\n",x,hashTable[x]);
}
}
return 0;
}
还有对于字符串的hash见如下:
#include<stdio.h>
const int maxn=100;
char S[maxn][5],temp[5];
int hashTable[26*26*26+10]={0};
int hashFunc(char S[],int len)
{
int id=0;
for(int i=0;i<len;i++)
{
id=id*26+(S[i]-'A');
}
return id;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++)
{
scanf("%s",S[i]);
int id =hashFunc(S[i],3);
hashTable[id]++;
}
for(int i=0;i<m;i++)
{
scanf("%s",temp);
int id=hashFunc(temp,3);
printf("%d\n",hashTable[id]);
}
return 0;
}