Hash及其应用练习题
前导知识
:
哈希表
:
1. A-B 数对
#include <iostream>
#include <unordered_map>
using namespace std;
const int MAX_N = 2e5 + 5;
typedef long long ll;
ll a[MAX_N];
unordered_map<ll,ll> m;
int main(){
int n;
ll c;
ll ans=0;
ios::sync_with_stdio(false);
cin>>n>>c;
for(int i=1;i<=n;i++){
cin>>a[i];
m[a[i]]++;
a[i]-=c;
}
for(int i=1;i<=n;i++) ans+=m[a[i]];
cout<<ans<<endl;
return 0;
}
分析
:
将 A − B = C A-B=C A−B=C转化为 A − C = B A-C=B A−C=B,记录每组每个元素出现的个数,那么将 A − C A-C A−C映射到了 B B B上,记录每个元素次数之和。
2. 【模板】字符串哈希
set
:
#include <iostream>
#include <string>
#include <set>
using namespace std;
int n;
string s;
set<string> se;
int main(){
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++){
cin>>s;
se.insert(s);
}
cout<<se.size()<<endl;
return 0;
}