/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
class FileSystem {
Map
<String, Runnable
> callbackMap
;
public FileSystem() {
this.pathMap = new HashMap<>();
this.callbackMap = new HashMap<>();
this.pathMap.put("", 0);
}
public boolean create
(String path,
int value
) { if (pathMap.containsKey(path)) {
return false;
}
int lastSlashIndex = path.lastIndexOf("/");
if (!pathMap.containsKey(path.substring(0, lastSlashIndex))) {
return false;
}
pathMap.put(path, value);
return true;
}
public boolean set
(String path,
int value
) { if (!pathMap.containsKey(path)) {
return false;
}
pathMap.put(path, value);
// Trigger callbacks
while (curPath.length() > 0) {
if (callbackMap.containsKey(curPath)) {
callbackMap.get(curPath).run();
}
int lastSlashIndex = path.lastIndexOf("/");
curPath = curPath.substring(0, lastSlashIndex);
}
return true;
}
return pathMap.get(path);
}
if (!pathMap.containsKey(path)) {
return false;
}
callbackMap.put(path, callback);
return true;
}
}
public class Main {
public static void main
(String[] args
) { FileSystem fs = new FileSystem();
System.
out.
println(fs.
get("/a")); // null System.
out.
println(fs.
set("/a",
2)); // false System.
out.
println(fs.
create("/a",
1)); // true System.
out.
println(fs.
get("/a")); // 1 System.
out.
println(fs.
create("/a/b",
2)); // true System.
out.
println(fs.
create("/b/c",
3)); // false @Override
public void run() {
System.
out.
println("callback on /a/b"); }
}));
@Override
public void run() {
System.
out.
println("callback on /a"); }
}));
System.
out.
println(fs.
set("/a/b",
10)); // trigger 2 callbacks and true }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgpjbGFzcyBGaWxlU3lzdGVtIHsKICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBwYXRoTWFwOwogIE1hcDxTdHJpbmcsIFJ1bm5hYmxlPiBjYWxsYmFja01hcDsKCiAgcHVibGljIEZpbGVTeXN0ZW0oKSB7CiAgICB0aGlzLnBhdGhNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICB0aGlzLmNhbGxiYWNrTWFwID0gbmV3IEhhc2hNYXA8PigpOwogICAgdGhpcy5wYXRoTWFwLnB1dCgiIiwgMCk7CiAgfQoKICBwdWJsaWMgYm9vbGVhbiBjcmVhdGUoU3RyaW5nIHBhdGgsIGludCB2YWx1ZSkgewogICAgaWYgKHBhdGhNYXAuY29udGFpbnNLZXkocGF0aCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGludCBsYXN0U2xhc2hJbmRleCA9IHBhdGgubGFzdEluZGV4T2YoIi8iKTsKICAgIGlmICghcGF0aE1hcC5jb250YWluc0tleShwYXRoLnN1YnN0cmluZygwLCBsYXN0U2xhc2hJbmRleCkpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBwYXRoTWFwLnB1dChwYXRoLCB2YWx1ZSk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHB1YmxpYyBib29sZWFuIHNldChTdHJpbmcgcGF0aCwgaW50IHZhbHVlKSB7CiAgICBpZiAoIXBhdGhNYXAuY29udGFpbnNLZXkocGF0aCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHBhdGhNYXAucHV0KHBhdGgsIHZhbHVlKTsKCiAgICAvLyBUcmlnZ2VyIGNhbGxiYWNrcwogICAgU3RyaW5nIGN1clBhdGggPSBwYXRoOwogICAgd2hpbGUgKGN1clBhdGgubGVuZ3RoKCkgPiAwKSB7CiAgICAgIGlmIChjYWxsYmFja01hcC5jb250YWluc0tleShjdXJQYXRoKSkgewogICAgICAgIGNhbGxiYWNrTWFwLmdldChjdXJQYXRoKS5ydW4oKTsKICAgICAgfQogICAgICBpbnQgbGFzdFNsYXNoSW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKCIvIik7CiAgICAgIGN1clBhdGggPSBjdXJQYXRoLnN1YnN0cmluZygwLCBsYXN0U2xhc2hJbmRleCk7CiAgICB9CgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBwdWJsaWMgSW50ZWdlciBnZXQoU3RyaW5nIHBhdGgpIHsKICAgIHJldHVybiBwYXRoTWFwLmdldChwYXRoKTsKICB9CgogIHB1YmxpYyBib29sZWFuIHdhdGNoKFN0cmluZyBwYXRoLCBSdW5uYWJsZSBjYWxsYmFjaykgewogICAgaWYgKCFwYXRoTWFwLmNvbnRhaW5zS2V5KHBhdGgpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBjYWxsYmFja01hcC5wdXQocGF0aCwgY2FsbGJhY2spOwogICAgcmV0dXJuIHRydWU7CiAgfQp9CgpwdWJsaWMgY2xhc3MgTWFpbiB7CiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgRmlsZVN5c3RlbSBmcyA9IG5ldyBGaWxlU3lzdGVtKCk7CiAgICBTeXN0ZW0ub3V0LnByaW50bG4oZnMuZ2V0KCIvYSIpKTsgLy8gbnVsbAogICAgU3lzdGVtLm91dC5wcmludGxuKGZzLnNldCgiL2EiLCAyKSk7IC8vIGZhbHNlCiAgICBTeXN0ZW0ub3V0LnByaW50bG4oZnMuY3JlYXRlKCIvYSIsIDEpKTsgLy8gdHJ1ZQogICAgU3lzdGVtLm91dC5wcmludGxuKGZzLmdldCgiL2EiKSk7IC8vIDEKICAgIFN5c3RlbS5vdXQucHJpbnRsbihmcy5jcmVhdGUoIi9hL2IiLCAyKSk7IC8vIHRydWUKICAgIFN5c3RlbS5vdXQucHJpbnRsbihmcy5jcmVhdGUoIi9iL2MiLCAzKSk7IC8vIGZhbHNlCiAgICBTeXN0ZW0ub3V0LnByaW50bG4oZnMud2F0Y2goIi9hL2IiLCBuZXcgUnVubmFibGUoKSB7CiAgICAgIEBPdmVycmlkZQogICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjYWxsYmFjayBvbiAvYS9iIik7CiAgICAgICAgU3lzdGVtLmV4aXQoMCk7CiAgICAgIH0KICAgIH0pKTsKICAgIFN5c3RlbS5vdXQucHJpbnRsbihmcy53YXRjaCgiL2EiLCBuZXcgUnVubmFibGUoKSB7CiAgICAgIEBPdmVycmlkZQogICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjYWxsYmFjayBvbiAvYSIpOwogICAgICAgIFN5c3RlbS5leGl0KDApOwogICAgICB9CiAgICB9KSk7CiAgICBTeXN0ZW0ub3V0LnByaW50bG4oZnMuc2V0KCIvYS9iIiwgMTApKTsgLy8gdHJpZ2dlciAyIGNhbGxiYWNrcyBhbmQgdHJ1ZQogIH0KfQ==