#include <iostream>
#include <list>
#include <string>
#include <unordered_map>
class Item {
public:
Item(std::string new_value, std::list<std::string>::iterator new_iterator)
:value(new_value), iterator(new_iterator) {};
Item() {};
std::string value;
std::list<std::string>::iterator iterator;
};
class LruCache {
public:
LruCache(size_t max_size) :capacity_(max_size){}
void Set(const std::string& key, const std::string& value) {
auto item = cache_.find(key);
if (item == cache_.end()) {
CheckSize();
last_used_.push_front(key);
cache_[key] = Item(value, last_used_.begin());
} else {
PushFrontItem(item);
cache_[key].value = value;
}
}
bool Get(const std::string& key, std::string* value) {
auto item = cache_.find(key);
if (item != cache_.end()) {
*value = item->second.value;
PushFrontItem(item);
return true;
}
return false;
}
private:
void CheckSize() {
if (last_used_.size() >= capacity_) {
RemoveLast();
}
}
void RemoveLast () {
std::string last = last_used_.back();
last_used_.pop_back();
cache_.erase(last);
}
void PushFrontItem(std::unordered_map<std::string, Item>::iterator item) {
last_used_.erase(item->second.iterator);
last_used_.push_front(item->first);
item->second.iterator = last_used_.begin();
}
private:
size_t capacity_;
std::unordered_map<std::string, Item> cache_;
std::list<std::string> last_used_;
};
using namespace std;
#define REQUIRE(x) std::cout << x << std::endl;
void test()
{
LruCache cache(2);
std::string value;
cache.Set("a", "1");
cache.Set("b", "2");
cache.Set("c", "3");
REQUIRE(!cache.Get("a", &value));
REQUIRE(cache.Get("b", &value));
REQUIRE(cache.Get("c", &value));
cache.Set("b", "4");
cache.Set("c", "5");
cache.Set("b", "6");
cache.Set("e", "7");
REQUIRE(!cache.Get("c", &value));
REQUIRE(cache.Get("b", &value));
REQUIRE(cache.Get("e", &value));
cache.Get("b", &value);
cache.Set("f", "8");
REQUIRE(!cache.Get("e", &value));
REQUIRE(cache.Get("b", &value));
REQUIRE(cache.Get("f", &value));
}
int main() {
for (int i = 0; i < 5; ++i) {
test();
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKI2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgoKY2xhc3MgSXRlbSB7CnB1YmxpYzoKICAgIEl0ZW0oc3RkOjpzdHJpbmcgbmV3X3ZhbHVlLCBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBuZXdfaXRlcmF0b3IpCiAgICAgICAgICAgIDp2YWx1ZShuZXdfdmFsdWUpLCBpdGVyYXRvcihuZXdfaXRlcmF0b3IpIHt9OwogICAgSXRlbSgpIHt9OwogICAgc3RkOjpzdHJpbmcgdmFsdWU7CiAgICBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdGVyYXRvcjsKfTsKCgpjbGFzcyBMcnVDYWNoZSB7CnB1YmxpYzoKICAgIExydUNhY2hlKHNpemVfdCBtYXhfc2l6ZSkgOmNhcGFjaXR5XyhtYXhfc2l6ZSl7fQoKICAgIHZvaWQgU2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewogICAgICAgIGF1dG8gaXRlbSA9IGNhY2hlXy5maW5kKGtleSk7CiAgICAgICAgaWYgKGl0ZW0gPT0gY2FjaGVfLmVuZCgpKSB7CiAgICAgICAgICAgIENoZWNrU2l6ZSgpOwogICAgICAgICAgICBsYXN0X3VzZWRfLnB1c2hfZnJvbnQoa2V5KTsKICAgICAgICAgICAgY2FjaGVfW2tleV0gPSBJdGVtKHZhbHVlLCBsYXN0X3VzZWRfLmJlZ2luKCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFB1c2hGcm9udEl0ZW0oaXRlbSk7CiAgICAgICAgICAgIGNhY2hlX1trZXldLnZhbHVlID0gdmFsdWU7CiAgICAgICAgfQogICAgfQoKICAgIGJvb2wgR2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHN0ZDo6c3RyaW5nKiB2YWx1ZSkgewogICAgICAgIGF1dG8gaXRlbSA9IGNhY2hlXy5maW5kKGtleSk7CiAgICAgICAgaWYgKGl0ZW0gIT0gY2FjaGVfLmVuZCgpKSB7CiAgICAgICAgICAgICp2YWx1ZSA9IGl0ZW0tPnNlY29uZC52YWx1ZTsKICAgICAgICAgICAgUHVzaEZyb250SXRlbShpdGVtKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCnByaXZhdGU6CiAgICB2b2lkIENoZWNrU2l6ZSgpIHsKICAgICAgICBpZiAobGFzdF91c2VkXy5zaXplKCkgPj0gY2FwYWNpdHlfKSB7CiAgICAgICAgICAgIFJlbW92ZUxhc3QoKTsKICAgICAgICB9CiAgICB9CgogICAgdm9pZCBSZW1vdmVMYXN0ICgpIHsKICAgICAgICBzdGQ6OnN0cmluZyBsYXN0ID0gbGFzdF91c2VkXy5iYWNrKCk7CiAgICAgICAgbGFzdF91c2VkXy5wb3BfYmFjaygpOwogICAgICAgIGNhY2hlXy5lcmFzZShsYXN0KTsKICAgIH0KCiAgICB2b2lkIFB1c2hGcm9udEl0ZW0oc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBJdGVtPjo6aXRlcmF0b3IgaXRlbSkgewogICAgICAgIGxhc3RfdXNlZF8uZXJhc2UoaXRlbS0+c2Vjb25kLml0ZXJhdG9yKTsKICAgICAgICBsYXN0X3VzZWRfLnB1c2hfZnJvbnQoaXRlbS0+Zmlyc3QpOwogICAgICAgIGl0ZW0tPnNlY29uZC5pdGVyYXRvciA9IGxhc3RfdXNlZF8uYmVnaW4oKTsKICAgIH0KCnByaXZhdGU6CiAgICBzaXplX3QgY2FwYWNpdHlfOwogICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBJdGVtPiBjYWNoZV87CiAgICBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+IGxhc3RfdXNlZF87Cn07CgoKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIFJFUVVJUkUoeCkgc3RkOjpjb3V0IDw8IHggPDwgc3RkOjplbmRsOwoKdm9pZCB0ZXN0KCkKewogICAgTHJ1Q2FjaGUgY2FjaGUoMik7CiAgICBzdGQ6OnN0cmluZyB2YWx1ZTsKCgogICAgY2FjaGUuU2V0KCJhIiwgIjEiKTsKICAgIGNhY2hlLlNldCgiYiIsICIyIik7CiAgICBjYWNoZS5TZXQoImMiLCAiMyIpOwogICAgCiAgICBSRVFVSVJFKCFjYWNoZS5HZXQoImEiLCAmdmFsdWUpKTsKICAgIFJFUVVJUkUoY2FjaGUuR2V0KCJiIiwgJnZhbHVlKSk7CiAgICBSRVFVSVJFKGNhY2hlLkdldCgiYyIsICZ2YWx1ZSkpOwoKICAgIGNhY2hlLlNldCgiYiIsICI0Iik7CiAgICBjYWNoZS5TZXQoImMiLCAiNSIpOwogICAgY2FjaGUuU2V0KCJiIiwgIjYiKTsKCiAgICBjYWNoZS5TZXQoImUiLCAiNyIpOwogICAgCiAgICBSRVFVSVJFKCFjYWNoZS5HZXQoImMiLCAmdmFsdWUpKTsKICAgIFJFUVVJUkUoY2FjaGUuR2V0KCJiIiwgJnZhbHVlKSk7CiAgICBSRVFVSVJFKGNhY2hlLkdldCgiZSIsICZ2YWx1ZSkpOwoKICAgIGNhY2hlLkdldCgiYiIsICZ2YWx1ZSk7CiAgICBjYWNoZS5TZXQoImYiLCAiOCIpOwogICAgCiAgICBSRVFVSVJFKCFjYWNoZS5HZXQoImUiLCAmdmFsdWUpKTsKICAgIFJFUVVJUkUoY2FjaGUuR2V0KCJiIiwgJnZhbHVlKSk7CiAgICBSRVFVSVJFKGNhY2hlLkdldCgiZiIsICZ2YWx1ZSkpOwp9CgppbnQgbWFpbigpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7CiAgICAgICAgdGVzdCgpOwogICAgfQogICAgcmV0dXJuIDA7Cn0=