前置知识:何为哈希?
假设现在要存一个数组a[1,7,20000000,3289,10]
很简单,你可将他们存在a数组里。
但这样查找就会很不方便,尤其是当数很多的时候,你要开着循环一遍遍找(当然也可以采用二分)
或者你又说为了能O(1)找到这个数是否存在,你可用打勾数组。即读进来5,在a[5]=1;
但如果读进来一个很大的数,假设是1000000,你就要开一个很大的数组在a[1000000]=1;但其实最后只有三个数,你却开了这么大一个数组,岂不是浪费?
这就要用到hash了
hash[mod]=a[i]
mod就是n%一个贴近他的素数(数学家写了很长的证明,来证明%素数,冲突的几率会小一些)
那你可能就要问了:余数万一一样,不就冲突了吗?
没错,我们可以使用链表,或者是向量来处理这些冲突。
以%13为例
言归正传
集合元素,也不用多说了吧,标准hash
细节在代码中:
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> hash[15889];
int an,bn;
cin>>an;
int a[an+5];
for(int i=1;i<=an;i++)
{
cin>>a[i];
hash[a[i]%15889].push_back(a[i]);
}
cin>>bn;
int b[bn+5];
int ans=0;
for(int i=1;i<=bn;i++)
{
cin>>b[i];
int mod=b[i]%15889;
if(hash[mod].empty()) ans++;
else//如果不为空,那有可能就有冲突,就像图上面那一个拉开的小抽屉,全部要找一遍
{
int j;
for(j=0;j<hash[mod].size();j++)
if(hash[mod][j]==b[i]) break;
if(j==hash[mod].size()) ans++;//最后也没找到,ans++
}
}
cout<<ans<<endl;
return 0;
}