P3370 【模板】字符串哈希 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P3370
解题思路
1.开辟一个链式结构的数组(vector)
2.给出一个固定进制x,将一个串的每一个元素看做一个进制位上的数字
3.输入字符串,将该字符串视作一个x进制的数,转换后的数即是这个字符串的哈希值
4.对hash值进行取模操作(mod的大小取决于数组的大小)
5.于数组上找到该值的位置
- 判断此位置链表是否为空
- 不为空则遍历链表元素
- 找到相同元素则停止比较
- 未找到则添加该值,并更新ans
6.最后输出ans即可
代码示例
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1020;
int ans, n, mod = 1000;
vector<string> m[N];
void solve(string s) {
//将s变为0-999之间的值,且用130进制转化
int hash = 0;
for(int i = 0; i < s.size(); i++) {
hash = (hash * 130 + s[i]) % mod;
}
for(int i = 0; i < m[hash].size(); i++) {
if(m[hash][i] == s) return; //存在则中断
}
m[hash].push_back(s);
ans++;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n; cin >> n;
string s;
for(int i = 1; i <= n; i++) {
cin >> s;
solve(s);
}
cout << ans << '\n';
return 0;
}