详细题目见洛谷P3370字符转哈希
map做法(不要脸做法)
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;
string a[N];
map <string, bool> m;
int ans = 0;
int main() {
int n;
scanf ("%d", &n);
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) {
m[a[i]] = true;
}
for (int i = 1; i <= n; i++)
if (m[a[i]]) {
ans++;
m[a[i]] = false;
}
printf ("%d", ans);
return 0;
}
but但是,作为一个新时代好少年,我会用哈希再做一遍
#include<bits/stdc++.h>
using namespace std;
const int mod = 23333, base = 261;
int n, ans;
string s;
vector <string> hs[mod + 5];
void insert () {
int hash = 1;
for (int i = 0, len = s.size(); i < len; i++)
hash = (hash * 1ll * base + s[i]) % mod;
for (int i = 0; i < hs[hash].size (); i++)
if (hs[hash][i] == s) return;
hs[hash].push_back (s);
ans++;
}
int main () {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> s;
insert ();
}
cout << ans << endl;
return 0;
}