E. Fat Musha

内存限制:16 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:Special Judge

题目描述

Musha 告诉你,也许你会觉得这个题目挺复杂,但事实上,期末考试最后一题可能难度更大,能够顺利完成的同学少之又少。所以不要气馁,也不要轻言放弃,Musha 相信你一定可以的!Musha 还想提醒你,本题的输入解析并不困难,但曾经考过连读入部分都需要递归处理的压轴题(对,就是去年,你可以网上搜一搜),所以不可忽视。

Musha 在完成操作系统挑战性任务时,自己捣鼓出了一个文件系统,虽然和 Fat32 没有任何关系,但是依然取名为 Fat Musha,她想向你安利一下这个文件系统。

和我们平时使用的一样,从根目录开始,形成一个树状结构。树的节点可以为以下三种类型:

  • 文件夹(目录):可以有任意类型的子节点,也可以没有。根目录也是文件夹类型,为整个树状结构的根节点。
  • 常规文件:只能为叶子节点。
  • 硬链接:可以指向任意一个非硬链接节点。

硬链接

下面对硬链接进行解释。硬链接可以指向一个常规文件或者文件夹。

若硬链接指向一个常规文件,则可以通过硬链接访问、修改目标文件,直接对目标文件的修改也会在硬链接处同步。比如,硬链接 hard.lnk 指向文件 test.txt,我们可以通过 hard.lnk 修改 test.txt 的内容,再通过 test.txt 读取。

若硬链接指向一个文件夹,则我们也可以通过硬链接去直接访问、修改目标文件夹以及其子文件、子文件夹、子硬链接。比如,硬链接 fold.lnk 指向文件夹 hello,其中有文件 world,则 fold.lnk/worldhello/world 为同一个文件。对他们的修改也是相互同步的。

对于任何硬链接,若其指向一个文件夹,则保证从该硬链接指向的文件夹的子节点开始,不存在任何路径,能够再次访问到该硬链接。比如硬链接 l1.lnk 位于文件夹 fold 中,l1.lnk 不能指向 fold。这样,你在遍历时,不用考虑成环的问题。

下面说到,本题中的各种东西的名字仅由小写字母组成,你不用考虑有 . 或其他奇怪字符的情况。

占用大小

Musha 的这个文件系统很奇怪,首先,文件夹本身不占用空间,可以理解为大小为 0,但因为文件夹里面有内容,所以文件夹占用的空间为其子节点占用空间之总和;常规文件占用的大小以字节为单位;硬链接占用的大小时刻与它指向的内容保持一致,本身也不占用大小。

Musha 可以给文件夹设置最大占用空间,若某个操作使得任何一个文件夹超出了占用空间限制,则操作失败,不产生任何影响。

文件夹默认的空间限制为正无穷,你可以使用 2147483647 来代替。

初始状态与指令

初始,系统中只有一个根目录,用 root 表示,全部的操作均从根目录开始。

路径使用 / 隔开,且开头、末尾均没有 /,比如 root/include/cstdio 表示根目录下 include 文件夹中的 cstdio 文件。

整个文件系统的文件名、文件夹名、硬链接名只由小写字母组成同一个文件夹下的文件名、文件夹名、硬链接名不会重复。

有下列五种指令:

指令 介绍 示例
mkdir path 创建文件夹 mkdir root/include
limit path size 设置文件夹空间限制 limit root/include 1024
touch file 创建文件 touch root/include/cstdio
edit file size 设置文件的大小 edit root/include/cstdio 42
mklnk dst src 创建硬链接 mklnk root/usr/inc/cstdio root/include/cstdio
  1. 创建文件夹:允许逐层创建,保证从 root 开始,且完全合法,保证至少可以创建一个文件夹。
  2. 文件夹空间限制:允许多次设置,若 size 小于当前实际占用,则设置失败。数据保证 path 存在且为文件夹或指向文件夹的硬链接。
  3. 创建文件:要求父文件夹必须存在,否则创建失败。也不可以与同文件夹内的文件夹、硬链接名重合,否则也算创建失败。文件初始大小为 0.
  4. 设置文件的大小:允许多次设置,数据保证 file 存在且不是文件夹或指向文件夹的硬链接。
  5. 创建硬链接:创建硬链接 dst 指向 src,数据保证 src 存在,保证 dst 的父文件夹存在,且硬链接没有与父文件夹中的其他内容重名。请留意,src 当然也可以是一个硬链接,在这种情况下,你应该使 dst 指向 src 所指向的内容。

输入格式

输入一共 行,第一行一个正整数 表示操作的个数。

接下来的 行,每行一条指令,会严格按照上述格式给出,不会有多余的空行、空格、符号等。

文件夹层次不会超过 10,题设全部的 size 为不超过 4096 的正整数。单位均为字节。

任何内容的名字由小写字母组成,不会超过 32 字符,也不会为空串。

.

输出格式

对于每一行指令,输出一行 YesNo,表示操作的成功与否。你要是高兴也可以输出 YeS 或者 NO,测评时会忽略大小写。

样例

输入样例

10
mkdir root/include/cpp
mkdir root/include/c
limit root 4096
touch root/include/cpp/cstdio
touch root/include/cxx/cstdio
edit root/include/cpp/cstdio 100
mklnk root/include/lnk root/include/cpp/cstdio
edit root/include/lnk 200
limit root/include/cpp 199
limit root 300

输出样例

Yes
Yes
Yes
Yes
No
Yes
Yes
Yes
No
No

最终,文件结构如下:

root              文件夹,limit=4096,占用大小=400
 |-include        文件夹,占用大小=400
    |- c          文件夹,占用大小=0
    |- cpp        文件夹,占用大小=200
    |   |- cstdio 文件,size=200
    |- lnk  ->  root/include/cpp/cstdio,占用大小=200

数据范围与提示

测试点分布如下:

编号 描述 部分分
#1 没有硬链接 no
#2 只有指向文件的硬链接
#3 硬链接可以指向 内部递归地没有硬链接的 文件夹 yes
#4 较为复杂的文件结构
#5 复杂的文件结构

部分分:该测试点未完全通过,但满足一定条件,也可以给予该测试点一定的分数。

编辑器加载中 …
通告标题

通告内容

已知晓