#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
template<typename T>
class lookup {
std::unordered_map<T, int> position;
public:
lookup(const std::vector<T>& a) {
for(int i = 0; i < a.size(); ++i) position.emplace(a[i], i);
}
int operator()(const T& key) const {
auto pos = position.find(key);
return pos == position.end() ? -1 : pos->second;
}
};
template<typename T>
static lookup<T> make_lookup(const std::vector<T>& a) {
return lookup<T>(a);
}
int main() {
std::vector<std::string> foo{"a", "b", "d", "e", "g", "k", "m", "n", "r", "x"};
auto find = make_lookup(foo);
for(std::string key : {"g", "m", "p"}) {
std::cout << find(key) << std::endl;
}
return 0;
}
CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjbGFzcyBsb29rdXAgewogIHN0ZDo6dW5vcmRlcmVkX21hcDxULCBpbnQ+IHBvc2l0aW9uOwpwdWJsaWM6CiAgbG9va3VwKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiBhKSB7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgYS5zaXplKCk7ICsraSkgcG9zaXRpb24uZW1wbGFjZShhW2ldLCBpKTsKICB9CiAgaW50IG9wZXJhdG9yKCkoY29uc3QgVCYga2V5KSBjb25zdCB7CiAgICBhdXRvIHBvcyA9IHBvc2l0aW9uLmZpbmQoa2V5KTsKICAgIHJldHVybiBwb3MgPT0gcG9zaXRpb24uZW5kKCkgPyAtMSA6IHBvcy0+c2Vjb25kOwogIH0KfTsKIAp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdGF0aWMgbG9va3VwPFQ+IG1ha2VfbG9va3VwKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiBhKSB7CiAgcmV0dXJuIGxvb2t1cDxUPihhKTsKfQoKaW50IG1haW4oKSB7CiAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZvb3siYSIsICJiIiwgImQiLCAiZSIsICJnIiwgImsiLCAibSIsICJuIiwgInIiLCAieCJ9OwogIGF1dG8gZmluZCA9IG1ha2VfbG9va3VwKGZvbyk7CiAgZm9yKHN0ZDo6c3RyaW5nIGtleSA6IHsiZyIsICJtIiwgInAifSkgewogICAgc3RkOjpjb3V0IDw8IGZpbmQoa2V5KSA8PCBzdGQ6OmVuZGw7CiAgfQogIHJldHVybiAwOwp9Cgo=