有空再改一下
#include <iostream>
#include<vector>
#include<set>
using namespace std;
struct treenode {
treenode() :LD(0), LR(0), curD(0), curR(0) {};
set<treenode*> sett;
treenode* parents;
bool isfile;
int LD;
int LR;
int curD;
int curR;
int size;
string name;
};
treenode *root, *createFlag;
void splitstr(string str,vector<string>& vec) {
int i = 1,j;
while (i < str.length()) {
j = str.find("/", i);
if (j != -1) {
vec.push_back(str.substr(i, j - i));
i = j+1;
}
else {
vec.push_back(str.substr(i, str.length()-i));
break;
}
}
}
void processC(vector<string>& vec,int size) {
createFlag = NULL;
treenode* it = root;
for (int i = 0; i < vec.size(); i++) {
if (i == vec.size() - 1) {//到最后一个文件名
set<treenode*>::iterator itt;
for (itt = it->sett.begin(); itt != it->sett.end(); itt++) {//遍历该目录下的文件和目录
if ((*itt)->name == vec[i]) { //如果能找到该文件
if (!(*itt)->isfile) { //如果找到的是目录
cout << "N" << endl;
return;
}
else if ((it->LD == 0 && it->LR == 0) || (*itt)->size >= size //如果不限配额
||(it->LD == 0 && it->curR - (*itt)->size + size <= it->LR) //如果目录配额不限,后代配额够用
||(it->LR == 0 && it->curD - (*itt)->size + size <= it->LD) //如果目录配额够用,后代配额不限
||(it->curD - (*itt)->size + size <= it->LD && it->curR - (*itt)->size + size <= it->LR)) { //如果目录配额够用 后代配额够用
int sub = size - (*itt)->size;
(*itt)->size = size;
it->curD += sub;
it->curR += sub;
it = it->parents;
while (it) {
if (it->LR == 0 || (it->curR + sub) <= it->LR) {
it->curR += sub;
it = it->parents;
}
else {
if (createFlag != NULL) {
createFlag->parents->sett.erase(createFlag);
}
cout << "N" << endl;
return;
}
}
cout << "Y" << endl;
return;
}
else { //配额不够用
cout << "N" << endl;
return;
}
}
}
if (itt == it->sett.end()) {//暂未创建这个文件
if ((it->LD == 0 && it->LR == 0)
|| (it->LD == 0 && it->curR + size < it->LR)
|| (it->LR == 0 && it->curD + size < it->LD)
|| (it->curD + size < it->LD && it->curR + size < it->LR)) {
cout << "Y" << endl;
treenode* newnode = new treenode();
newnode->isfile = 1;
newnode->name = vec[i];
newnode->parents = it;
newnode->size = size;
it->sett.insert(newnode);
it->curD += size;
it->curR += size;
it = it->parents;
while (it) {
if (it->LR == 0 || (it->curR + size) <= it->LR) {
it->curR += size;
it = it->parents;
}
else {
if (createFlag != NULL) {
createFlag->parents->sett.erase(createFlag);
}
cout << "N" << endl;
return;
}
}
return;
}
else {
cout << "N" << endl;
return;
}
}
}
else { //还没到最后一个文件名
set<treenode*>::iterator itt;
bool flag = true;
for (itt = it->sett.begin(); itt != it->sett.end(); itt++) {
if ((*itt)->name == vec[i]) {
if ((*itt)->isfile) {
cout << "N" << endl;
return;
}
else {
it = *itt;
flag = false;
break;
}
}
}
if (flag&& itt == it->sett.end()) { //当前目录下不存在该文件夹
if (it->LR==0||it->LR - it->curR >= size) {
treenode* newnode = new treenode();
newnode->isfile = 0;
newnode->name = vec[i];
newnode->parents = it;
it->sett.insert(newnode);
it = newnode;
createFlag = newnode;
}
else {
cout << "N" << endl;
return;
}
}
}
}
}
void processR(vector<string>& vec) {
cout << "Y" << endl;
treenode* it = root;
if (vec.empty()) {
it->curD = 0;
it->curR = 0;
it->sett.erase(it->sett.begin(), it->sett.end());
return;
}
for (int i = 0; i < vec.size(); i++) {
bool flag = true;
set<treenode*>::iterator itt;
for (itt = it->sett.begin(); itt != it->sett.end(); itt++) {
if ((*itt)->name == vec[i]) {
if (i == vec.size() - 1) {
if ((*itt)->isfile) {
int plus = (*itt)->size;
it->curD -= plus;
it->curR -= plus;
it->sett.erase(*itt);
it = it->parents;
while (it) {
it->curR -= plus;
it = it->parents;
}
return;
}
else {
int plus = (*itt)->curR;
it->curD -= plus;
it->curR -= plus;
it->sett.erase(*itt);
it = it->parents;
while (it) {
it->curR -= plus;
it = it->parents;
}
return;
}
}
else {
it = *itt;
flag = false;
break;
}
}
}
if (flag) {
return;
}
}
}
void processQ(vector<string>& vec,int LD,int LR) {
treenode* it = root;
if (vec.empty()) {
if ((LD == 0 && LR == 0)
|| (it->curD <= LD && it->curR <= LR)
|| (LD == 0 && it->curR <= LR)
|| (LR == 0 && it->curD <= LD) ){
cout << "Y" << endl;
it->LD = LD;
it->LR = LR;
return;
}
else {
cout << "N" << endl;
return;
}
}
for (int i = 0; i < vec.size(); i++) {
bool flag = true;
for (auto itt = it->sett.begin(); itt != it->sett.end(); itt++) {
if ((*itt)->name == vec[i]) {
if (i == vec.size() - 1) {
if ((*itt)->isfile) {
cout << "N" << endl;
return;
}
else if ((LD == 0 && LR == 0)
|| ((*itt)->curD <= LD && (*itt)->curR <= LR)
|| (LD == 0&&(*itt)->curR<=LR)
||(LR==0&&(*itt)->curD<=LD)) {
cout << "Y" << endl;
(*itt)->LD = LD;
(*itt)->LR = LR;
return;
}
else {
cout << "N" << endl;
return;
}
}
else {
it = *itt;
flag = false;
break;
}
}
}
if (flag) {
cout << "N" << endl;
return;
}
}
}
int main()
{
root = new treenode();
root->LD = 0;
root->LR = 0;
root->curR = 0;
root->curD = 0;
root->isfile = 0;
root->parents = NULL;
int n,size,LD,LR;
char c;
string str;
cin >> n;
while (n--) {
cin >> c;
switch (c)
{
case 'C': {
cin >> str >> size;
vector<string> vec;
splitstr(str, vec);
processC(vec, size);
break;
}
case 'R': {
cin >> str;
vector<string> vec;
splitstr(str, vec);
processR(vec);
break;
}
case 'Q': {
cin >> str >> LD >> LR;
vector<string> vec;
splitstr(str, vec);
processQ(vec, LD, LR);
break;
}
default:
break;
}
}
return 0;
}