#include <iostream>
#include <unordered_map>
#include <string>
struct CaseInsensitiveHash {
size_t operator()(const std::string& key) const {
size_t hash = 0;
for (char c : key) {
hash = hash * 31 + std::tolower(c);
}
return hash;
}
};
struct CaseInsensitiveEqual {
bool operator()(const std::string& left, const std::string& right) const {
return std::equal(left.begin(), left.end(), right.begin(), right.end(),
[](char a, char b) { return std::tolower(a) == std::tolower(b); });
}
};
int main() {
std::unordered_multimap<std::string, int, CaseInsensitiveHash, CaseInsensitiveEqual> umm;
umm.insert({"Apple", 1});
umm.insert({"apple", 2});
umm.insert({"APPLE", 3});
for (const auto& pair : umm) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
return 0;
}