C++ 将字符串映射为一个整数,采用基本多项式哈希
#include <iostream> #include <string> #include <vector> using namespace std; // 基本多项式哈希 - 将字符串映射为一个整数 class PolynomialHash { private: unsigned long long base = 911382629; unsigned long long mod = 1000000000000000003ULL; vector<unsigned long long> hashes; public: unsigned long long getHash(string s) const { unsigned long long hash = 0; for (char c : s) { hash = (hash * base + static_cast<unsigned long long>(c)) % mod; // static_cast<unsigned long long>(c) 将char转换为ull // 虽然不太理解,但是这是关键,可以直接背下来 } return hash; } bool isInHash(unsigned long long hash) const { for (unsigned long long h: hashes) { if (h==hash) return true; } return false; } void insert(string s) { unsigned long long hash; hash = getHash(s); if (!isInHash(hash)) { hashes.push_back(hash); } } int getSize() { return hashes.size(); } }; int main() { int n; PolynomialHash H; string s; cin >> n; while (n--) { cin >> s; H.insert(s); } cout << H.getSize() << endl; } // 64 位输出请用 printf("%lld")
直接使用c++ unordered_set<string>
#include <iostream> #include <string> #include <unordered_set> using namespace std; int main() { int n; unordered_set<string> H; string s; cin >> n; while (n--) { cin >> s; H.insert(s); } cout << H.size() << endl; } // 64 位输出请用 printf("%lld")