字符串哈希 - # P3370 【模板】字符串哈希
题目描述
如题,给定 \(N\) 个字符串(第 \(i\) 个字符串长度为 \(M_i\),字符串内包含数字、大小写字母,大小写敏感),请求出 \(N\) 个字符串中共有多少个不同的字符串。
友情提醒:如果真的想好好练习哈希的话,请自觉。
输入格式
第一行包含一个整数 \(N\),为字符串的个数。
接下来 \(N\) 行每行包含一个字符串,为所提供的字符串。
输出格式
输出包含一行,包含一个整数,为不同的字符串个数。
输入输出样例 #1
输入 #1
5
abc
aaaa
abc
abcc
12345
输出 #1
4
说明/提示
数据范围
对于 \(30\%\) 的数据:\(N\leq 10\),\(M_i≈6\),\(M_{\max}\leq 15\)。
对于 \(70\%\) 的数据:\(N\leq 1000\),\(M_i≈100\),\(M_{\max}\leq 150\)。
对于 \(100\%\) 的数据:\(N\leq 10000\),\(M_i≈1000\),\(M_{\max}\leq 1500\)。
样例说明
样例中第一个字符串 \(\tt{abc}\) 和第三个字符串 \(\tt{abc}\) 是一样的,所以所提供字符串的集合为 \(\{\tt{aaaa},\tt{abc},\tt{abcc},\tt{12345}\}\),故共计 \(4\) 个不同的字符串。
#include <bits/stdc++.h>
using namespace std;
#define LL long long
// 双哈希模数、基数
const LL MOD1 = 1000000007;
const LL MOD2 = 1000000009;
const int BASE = 131;
int main() {
int n;
cin >> n;
set<pair<LL, LL>> st; // 集合自动去重,存(哈希1,哈希2)
while (n--) {
string s;
cin >> s;
LL h1 = 0, h2 = 0;
// 滚动求整串双哈希
for (char c : s) {
int x = c;
h1 = (h1 * BASE + x) % MOD1;
h2 = (h2 * BASE + x) % MOD2;
}
st.insert({h1, h2}); // 插入哈希对,重复自动舍弃
}
cout << st.size() << endl; // 集合元素个数=不同字符串数量
return 0;
}

浙公网安备 33010602011771号