#105. 回收站

内存限制:16 MiB 时间限制:200 ms 输入文件:filesystem.txt 输出文件:original_fs.txt
题目类型:传统 评测方式:文本比较
上传者: zyy

题目描述

zyy的电脑被误删了很多文件,幸运的是它们都在回收站里,请你帮他恢复被删除的文件和文件夹。

进行恢复操作时,首先恢复文件夹,再恢复文件。

当恢复文件夹时,按删除时间从新到老逐个恢复(保证没有同时删除的文件)。如果遇到冲突(即目标文件夹已经存在一个同名子文件夹),清空该子文件夹内的所有内容

当恢复文件时,也按删除时间从新到老逐个恢复(保证没有同时删除的文件)。如果遇到冲突(即目标文件夹已经存在一个同名文件),将原在文件系统中的文件(即上一个括号里指的“同名文件”)后缀加.bak备份(如果已经存在备份,覆盖之)后,恢复回收站的文件。

回收站的文件夹均为空文件夹。当文件夹被移动到回收站的时候,系统会依次递归删除所有的子文件(夹),保证子文件(夹)的删除时间早于父文件夹。例如,删除一个内含文件的文件夹后,回收站会多出三个文件和一个空文件夹。

保证不会出现因路径不存在导致的还原失败。

本题测试点(按序):样例、文件还原、文件夹还原、文件冲突、文件夹冲突),每点1/5分。

输入格式

filesystem.txt读入文件系统结构,保证子文件(夹)的读入一定晚于父文件夹。

<name> <type> <path>   <preview>   <last_mod_time>
 名称    类型    路径  文件内容前5个字符     修改时间

(根目录的<path>由*代替),(文件夹的<preview>均为'-',但是它们并没有用)

当读到

___ENDED___ - - - 1

后,继续读入回收站内容(其实是OJ不支持多文件输入desu)

<name> <type> <original_path>    <preview>      <last_mod_time> <recycled_time>
 名称    类型       原始路径      文件内容前5个字符       修改时间          删除时间

下面是各项的解释:

<path>和<original_path>为长度小于1000的字符串,格式如"C\Program_Files\DevCpp",保证**不**以'\'结尾
<name>长度小于100,不含空格
<last_mod_time>和<recycled_time>均为12位数字串
<type>: file==文件, folder==文件夹

保证以上各项中均不含空格及不可见字符

输出格式

以树状结构输出文件结构,输出到original_fs.txt。同目录下先输出文件夹、再输出文件,按照名称字典序升序排列。

文件:

【按级别缩进(\t)】<name>(<preview>:<last_mod_time>)

文件夹:

【按级别缩进(\t)】<name>

例如

C
	Apple
	Bonjour
	Program_Files
		DevCpp
			devcpp.exe(ssjqs:199001010158)
	a_secret_file.txt(secre:202203132018)
	msdia80.dll(nothi:202203141940)

(根目录不缩进,之后每级增加一次缩进 '\t' )

样例

【样例输入】

filesystem.txt内容:

C folder * - 201901024772
Apple folder C - 201904081202
Program_Files folder C - 202002130908
DevCpp folder C\Program_Files - 202203190807
msdia80.dll file C nothi 202203141940
___ENDED___ - - - 1
Bonjour folder C - 202203190403 202206011309
devcpp.exe file C\Program_Files\DevCpp ssjqs 199001010158 202206011307
a_secret_file.txt file C secre 202203132018 202205310102
msdia80.dll file C older 202203141421 202205210102

【样例输出】

C
	Apple
	Bonjour
	Program_Files
		DevCpp
			devcpp.exe(ssjqs:199001010158)
	a_secret_file.txt(secre:202203132018)
	msdia80.dll(older:202203141421)
	msdia80.dll.bak(nothi:202203141940)

数据范围与提示

文件与文件夹总个数小于300,同文件夹下文件与文件夹个数和不超过50。回收站文件(夹)个数小于30.

因为处理路径字符串有点麻烦,并不想在这里卡住大家,可以参考以下代码

typedef struct fs {			//假设多叉树节点如下
    char name[200];
    struct fs *sub[100];	//子节点指针数组
    int subcnt;				//子节点个数
	...
} *ff;

char *pp,*p;				//p为字符串快指针,pp为字符串慢指针
pp = strchr(temp, '\\');	//temp数组为读入的路径字符串
if(pp!=NULL)p = strchr(pp + 1, '\\');else p = NULL;
ff h = root; 				// ff是树的节点的结构体指针,root是根节点指针
while (pp != NULL) {
	if(p)*p = 0;
	//【补全:在h的子树中找到与pp+1名称相同的节点,并把h指向该节点】
	pp = p;
	if(pp)p = strchr(pp + 1, '\\');
}
//【补全:此时h指针最终位置的父节点,把新节点插入到h的子节点数组中】

本题按点给分(文件还原、文件夹还原、文件冲突、文件夹冲突),每点1/4分。

通告标题

通告内容

已知晓