大模拟写得还是很痛苦,这题比较痛苦的是怎么比较优雅地沿着路径更新与判断,还是学长的代码优雅,获取节点指针和文件名,使节点指针和文件名对应,很棒。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll MAXN = 1e19;
struct Files {
string name;
bool isDir;
ll LD;
ll LR;
ll ld;
ll lr;
ll size;
map<string,Files> ch;
Files():LD(MAXN),LR(MAXN),ld(0),lr(0),size(0),isDir(true){}
}rt;
vector<string> parse(const string& s) {
stringstream ss(s);
string tmp;vector<string> ret;
while(getline(ss,tmp,'/')) {ret.push_back(tmp);}
return ret;
}
vector<Files*> getNodes(const vector<string>& s) {//获取所有能够获取到的节点
vector<Files*> ret;
ret.push_back(&rt);
for (int i = 1; i < s.size(); i++) {
if (ret.back()->ch.count(s[i])) {
ret.push_back(&ret.back()->ch[s[i]]);
} else {
return ret;
}
}
return ret;
}
bool solveC(const vector<string>& files, int size) {
vector<Files*> nodes = getNodes(files);
ll diff = size;
if (nodes.size() == files.size()) {//有,nodes[i]的名字对应files[i],files[0]=“”
if (nodes.back()->isDir) {return false;}//文件夹
diff = size - nodes.back()->size;//替换
} else {//没有
if (!nodes.back()->isDir) {return false;}
diff = size;
}
for (int i = 0; i < nodes.size() && i + 1 < files.size(); i++) {//判断可不可以
if (diff + nodes[i]->lr > nodes[i]->LR) {return false;}
if (i + 2 == files.size())
if (diff + nodes[i]->ld > nodes[i]->LD) {return false;}
}
for (int i = nodes.size(); i < files.size(); i++) {
nodes.push_back(&nodes.back()->ch[files[i]]);//添加节点
}
nodes.back()->isDir = false;
nodes.back()->size = size;
nodes[nodes.size() - 2]->ld += diff;
for (auto& e:nodes) {
e->lr += diff;
}
return true;
}
bool solveR(const vector<string>& files) {
vector<Files*> nodes = getNodes(files);
if (files.size() != nodes.size()) {return true;}
ll diff = 0;
if (!nodes.back()->isDir) {
diff = nodes.back()->size;
nodes[nodes.size() - 2]->ld -= diff;
} else {
diff = nodes.back()->lr;
}
nodes[nodes.size() - 2]->ch.erase(files.back());
nodes.pop_back();
for (auto& ele: nodes) {
ele->lr -= diff;
}
return true;
}
bool solveQ(const vector<string>& files) {
vector<Files*> nodes = getNodes(files);
ll ld,lr; cin >> ld >> lr;
if (nodes.size() != files.size()) {return false;}
if (!nodes.back()->isDir) {return false;}
if (ld == 0) {ld = MAXN;}
if (lr == 0) {lr = MAXN;}
if (ld < nodes.back()->ld) {return false;}
if (lr < nodes.back()->lr) {return false;}
nodes.back()->LD = ld;
nodes.back()->LR = lr;
return true;
}
void solve() {
string op,cmd; cin >> op >> cmd;
rt.name = "/";
auto res = false;
vector<string> files = parse(cmd);
if (op == "C") {
ll size; cin >> size;
res = solveC(files, size);
} else if (op == "R") {
solveR(files);
res = true;
} else {//Q
res = solveQ(files);
}
if (res) {
cout << "Y\n";
} else {
cout << "N\n";
}
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
solve();
}
}