题外: 啊这,大半年没来csdn了,都长草了。回来练练机试内容吧,现在敲个模拟题,磕磕绊绊的。。但是这大模拟恶心也是真恶心。。。


思路: 开始的时候跑偏了,本来是用的邻接表直接建边,但是问题是不在同一层的文件名可以重复,,有被坑到,那么就不能用全局的map给文件名编号了,得在结构体里面用map编号,这样的话就不用邻接表了,直接记录父节点回跳维护就行了。那么直接放代码吧,为了让自己视角清晰写了挺多注释的。


#include <stdio.h>
#include<iostream>
#include<algorithm>
#include<map>
#include<cstring>
#include<vector>
using namespace std;
const int N = 5e6+10;
typedef long long ll;
//LDd目录配额,LRd后代配额,LD现有目录额,LR现有后代额
struct node
{map<string,int> branch;   //每个目录节点的孩子节点(包括目录节点和普通文件)int isleaf;     //是否是普通文件ll LDd,LRd;     //目录配额,后代配额ll LD,LR;       //现有目录,后代ll val;         //普通文件的大小int fa;         //父节点编号
}tr[N];
int vex;   //有效文件名所属编号
string getindex(string &s,int &num)   //截取一个合法文件名
{string res="";int i;for(i=num;s[i]!='/'&&i<s.size();i++)res+=s[i];num=i+1;return res;
}
vector<pair<int,string> > v;
void del()   //若插入失败,对本次前面所有插入操作进行撤销
{for(int i=0;i<v.size();i++){int a=v[i].first;string b=v[i].second;tr[a].branch.erase(tr[a].branch.find(b));}
}
bool insert(string s,ll size)  //文件插入
{v.clear();int num=1,fa=0,init=vex,len=s.size();while(num<len)     //直至截取最后一个文件名{string ss=getindex(s,num);//如果要创建的目录文件与已有的同一双亲目录下的孩子文件中的普通文件名称重复,则该指令不能执行成功if(tr[fa].branch[ss] && tr[tr[fa].branch[ss]].isleaf && num<len)  {vex=init;del();return false;}int id,flag=0;if(tr[fa].branch[ss])  id=tr[fa].branch[ss],flag=1;else  //若不存在该目录/普通文件,进行创建id=++vex,tr[vex].isleaf=0,tr[vex].fa=fa,tr[vex].LDd=0,tr[vex].LRd=0,tr[fa].branch[ss]=vex,v.push_back(make_pair(fa,ss));if(num<len)fa=id;if(num>=len)   //遍历至叶子文件时{ll extra;  //需要更新的文件值if(flag)   //叶子文件如果已存在{if(!tr[id].isleaf)   //如果是个目录文件,插入失败{vex=init;del();return false;}extra=size-tr[id].val;}elseextra=size;if(tr[fa].LD+extra>tr[fa].LDd&&tr[fa].LDd)   //如果双亲目录的目录配额存在且因为插入该文件超额,插入失败{vex=init;del();return false;}tr[id].val=size;tr[id].LR=size;tr[id].isleaf=1;for(int r=fa;r!=-1;r=tr[r].fa)if(tr[r].LR+extra>tr[r].LRd&&tr[r].LRd)  //如果后代配额存在且会因为插入此文件超额,插入失败{vex=init;del();return false;}for(int r=fa;r!=-1;r=tr[r].fa)  //插入成功,更新整条路径tr[r].LR+=extra;tr[fa].LD+=extra;}}return true;
}
void remove(string s)   //移除文件
{int num=1,fa=0,len=s.size();while(num<len){string ss=getindex(s,num);if(!tr[fa].branch[ss]) return;   //若路径不存在,直接返回int id=tr[fa].branch[ss];if(num<len)fa=id;if(num<len&&tr[id].isleaf)  //如果路径不合法,返回return;if(num>=len){tr[fa].branch.erase(tr[fa].branch.find(ss));  //删除与双亲节点之间的路径for(int r=fa;r!=-1;r=tr[r].fa)   //更新前面祖宗节点的后代配额tr[r].LR-=tr[id].LR;if(tr[id].isleaf)     //若删除节点为叶子节点,更新双亲节点的目录配额tr[fa].LD-=tr[id].LR;}}
}
bool set(string s,ll ld,ll lr)   //设置配置额
{if(s.size()==1)  //配置根目录{int id=0;if((ld<tr[id].LD && ld) || (lr<tr[id].LR && lr))  //如果配置额小于当前已存在的文件大小,配置失败return false;tr[id].LRd=lr;tr[id].LDd=ld;return true;}int num=1,fa=0,len=s.size();while(num<len){string ss=getindex(s,num);if(!tr[fa].branch[ss]) return false;  //如果路径不存在,配置失败int id=tr[fa].branch[ss];fa=id;if(tr[id].isleaf) return false;   //如果配置的不是目录文件,配置失败if(num>=len){if((ld<tr[id].LD && ld) || (lr<tr[id].LR && lr))  //如果配置额小于当前已存在的文件大小,配置失败return false;tr[id].LRd=lr;tr[id].LDd=ld;  //修改额度,配置成功return true;}}
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);string s;int n;cin>>n;tr[0].fa=-1;tr[0].isleaf=0;tr[0].LDd=0;tr[0].LRd=0;while(n--){bool flag=true;char order;cin>>order;ll ld,lr,size;switch(order){case 'C':cin>>s>>size;flag=insert(s,size);break;case 'R':cin>>s;remove(s);break;case 'Q':cin>>s>>ld>>lr;flag=set(s,ld,lr);break;}if(flag)cout<<"Y"<<'\n';elsecout<<"N"<<'\n';}return 0;
}

ccf 202012-3 带配额的文件系统(大模拟)相关推荐

  1. 收藏 | 100+篇大数据学习资讯,带你玩转大数据分析!

    2019独角兽企业重金招聘Python工程师标准>>> 深度解析如何挑选适合自己的Hadoop平台 什么是Hadoop,怎样学习Hadoop 分布式文件系统HDFS解析 Hadoop ...

  2. 淘宝文件系统大文件结构

    文章目录 1 淘宝文件系统大文件结构 1.1 设计思路 1.2 大文件存储结构图 1.3 哈希链表简介 1 淘宝文件系统大文件结构 1.1 设计思路 主要有如下几个核心要点: 以block文件的形式存 ...

  3. 独家直播双十一全网动态?前黑客“劳改”带你玩转大数据

    独家直播双十一全网动态?前黑客"劳改"带你玩转大数据 发表于2015-11-24 10:26| 4044次阅读| 来源CSDN| 7 条评论| 作者蒲婧 CTO俱乐部CTOCTO讲 ...

  4. 涨姿势,图文带你了解 8 大排序算法

    转载自   涨姿势,图文带你了解 8 大排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问 ...

  5. 有个名叫史太滩的珠宝商带着块鸡蛋大的宝石乘船过江

    有个名叫史太滩的珠宝商带着块鸡蛋大的宝石乘船过江,他在船头正把玩着这块宝石,却不慎把宝石掉进了滚滚的大江水里,他就非常地悲伤郁闷,绝望地跳进了这条波涛汹涌.巨浪滔天的大江里.就在这时,晴朗的天空突然打 ...

  6. php余额宝收益源码,2021亲测PHP投资理财分红源码 带积分商城+余额宝+大转盘+教程...

    2021亲测PHP投资理财分红源码 带积分商城+余额宝+大转盘+独家教程 这套金融理财投资源码功能还是蛮丰富的,源码的思路和其它的没什么区别,都是后台添加项目,前台用户进行投资,然后到了固定时间点获取 ...

  7. [luogu9141] [THUPC 2023 初赛] 乱西星上的空战 -大模拟 - 计算几何

    传送门:P9141 [THUPC 2023 初赛] 乱西星上的空战 大家好我又来了,这次带给大家的依然是THUPC的传统艺能大模拟~ 个人点评:这题是我个人写完并通过的算法竞赛中的大模拟题中最长的一道 ...

  8. 1014 Waiting in Line (30 分) 【未完成】【难度: 难 / 知识点: 大模拟】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805498207911936 大模拟代码有时间补

  9. ZOJ 3879(大模拟)

    传送门 题面:Capture the Flag Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge In comp ...

最新文章

  1. 初级脚本Ubuntu18-20.04版本以上设置静态IP地址
  2. {ValueError}invalid literal for int() with base 10: ‘1.0‘
  3. 从LXMERT到VLMO:多模态预训练模型的演变史
  4. 发现 ASP.NET Core SignalR
  5. 潮流色彩碰撞C4D几何空间!这样的艺术背景素材,设计师都喜欢
  6. 全局唯一递增的id_分布式系统全局唯一ID简介、特点、生成
  7. pe擦除服务器硬盘,如何使用老毛桃winpe的分区助手安全擦除移动硬盘或本地硬盘数据?...
  8. Java开发之消息队列
  9. Linux文件系统有哪些
  10. Java高级特性 - 多线程练习题
  11. Apk脱壳圣战之---如何脱掉“梆梆加固”的保护壳
  12. 电脑本机连了VPN 在虚拟机中没有连接 如何虚拟机共享主机VPN连接
  13. hifiasm对HiFi PacBio进行组装
  14. php 爬取新闻,scrapy抓取学院新闻报告
  15. leetcode 1. 黑白方格画
  16. python中geometry_tkinter窗口geometry函数的使用
  17. 实在智能RPA学院|切切切词!算法TopWORDS的原理及实现
  18. python编程输入数字输出月份英文_编程题:输入英文月份单词,输出对应月的数字形式。...
  19. 2019百家号自媒体推荐机制
  20. 头插法 (单链表)-----鱼c小甲鱼笔记

热门文章

  1. 支付宝扫福最佳攻略,你值得拥有
  2. 数字格式化、大数据BigDecimal、随机数生成方法random()
  3. ADB环境部署+ADB常见命令
  4. 极客标签:可能是目前最好的前端代码学习工具
  5. jetson机器上对lxde桌面设置中文输入法详细过程(图文展示)
  6. 微型计算机基础答案,第1章 微型计算机基础知识 题库和答案
  7. 计算机dns怎么设置方法,电脑的dns怎么设置具体方法
  8. clojure实现邮箱发送
  9. Android注册页面
  10. 309. Best Time to Buy and Sell Stock with Cooldown**