/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class LRUCache {
LinkedHashMap
<Integer, Integer
> LRUMap
;
public LRUCache(int capacity) {
LRUMap
= new LinkedHashMap
<Integer, Integer
>() { @Override
protected boolean removeEldestEntry
(Map.
Entry<Integer, Integer
> eldest
) { System.
out.
println("removeEldestEntry: " + eldest
+ "(size: " + LRUMap.
size() + ", cap: " + capacity
+ ")"); return LRUMap.size() > capacity;
}
};
}
public int get(int key) {
System.
out.
println("get: " + key
); if (LRUMap.containsKey(key)) {
int val = LRUMap.remove(key);
LRUMap.put(key, val);
return val;
}
return -1;
}
public int size() {
return LRUMap.size();
}
public void set(int key, int value) {
System.
out.
println("set: " + key
+ "=" + value
); LRUMap.put(key, value);
}
public static void main
(String[] args
) { LRUCache c = new LRUCache(2);
c.set(2,1);
c.set(1,1);
c.set(2,3);
c.set(4,1);
System.
out.
println("size:" + c.
size()); System.
out.
println("c:" + c.
LRUMap); }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgTFJVQ2FjaGUgewogICAgTGlua2VkSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBMUlVNYXA7CgogICAgcHVibGljIExSVUNhY2hlKGludCBjYXBhY2l0eSkgewogICAgICAgIExSVU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCkgewogICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRWxkZXN0RW50cnkoTWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+IGVsZGVzdCkgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZW1vdmVFbGRlc3RFbnRyeTogIiArIGVsZGVzdCArICIoc2l6ZTogIiArIExSVU1hcC5zaXplKCkgKyAiLCBjYXA6ICIgKyBjYXBhY2l0eSArICIpIik7CiAgICAgICAgICAgICAgICByZXR1cm4gTFJVTWFwLnNpemUoKSA+IGNhcGFjaXR5OwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KCiAgICBwdWJsaWMgaW50IGdldChpbnQga2V5KSB7CiAgICAJU3lzdGVtLm91dC5wcmludGxuKCJnZXQ6ICIgKyBrZXkpOwogICAgICAgIGlmIChMUlVNYXAuY29udGFpbnNLZXkoa2V5KSkgewogICAgICAgICAgICBpbnQgdmFsID0gTFJVTWFwLnJlbW92ZShrZXkpOwogICAgICAgICAgICBMUlVNYXAucHV0KGtleSwgIHZhbCk7CiAgICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIAogICAgcHVibGljIGludCBzaXplKCkgewogICAgCXJldHVybiBMUlVNYXAuc2l6ZSgpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldChpbnQga2V5LCBpbnQgdmFsdWUpIHsKICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oInNldDogIiArIGtleSArICI9IiArIHZhbHVlKTsKICAgICAgICBMUlVNYXAucHV0KGtleSwgdmFsdWUpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsgICAgCiAgICAgICAgTFJVQ2FjaGUgYyA9IG5ldyBMUlVDYWNoZSgyKTsKICAgICAgICBjLnNldCgyLDEpOwogICAgICAgIGMuc2V0KDEsMSk7CiAgICAgICAgYy5zZXQoMiwzKTsKICAgICAgICBjLnNldCg0LDEpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2l6ZToiICsgYy5zaXplKCkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYzoiICsgYy5MUlVNYXApOwogICAgfQp9