咕咕東的雪梨電腦的作業系統在上個月受到宇宙射線的影響,時不時發生故障,他受不了了,想要寫乙個高效易用零bug的作業系統 —— 這工程量太大了,所以他定了乙個小目標,從實現乙個目錄管理器開始。前些日子,東東的電腦終於因為過度收到宇宙射線的影響而宕機,無法寫**。他的好友tt正忙著在b站看貓片,另一位好友瑞神正忙著打守望先鋒。現在只有你能幫助東東!
初始時,咕咕東的硬碟是空的,命令列的當前目錄為根目錄 root。
目錄管理器可以理解為要維護一棵有根樹結構,每個目錄的兒子必須保持字典序。
現在咕咕東可以在命令列下執行以下**中描述的命令:
輸入
輸入檔案包含多組測試資料,第一行輸入乙個整數表示測試資料的組數 t (t <= 20);
每組測試資料的第一行輸入乙個整數表示該組測試資料的命令總數 q (q <= 1e5);
每組測試資料的 2 ~ q+1 行為具體的操作 (mkdir、rm 操作總數不超過 5000);
面對資料範圍你要思考的是他們代表的 「命令」 執行的最大可接受複雜度,只有這樣你才能知道你需要設計的是怎樣複雜度的系統。
output
每組測試資料的輸出結果間需要輸出一行空行。注意大小寫敏感。
限制
time limit 6000 ms
memory limit 1048576 kb
樣例
1
22mkdir dira
cd dirb
cd dira
mkdir a
mkdir b
mkdir c
cd .
.mkdir dirb
cd dirb
mkdir x
cd .
.mkdir dirc
cd dirc
mkdir y
cd ..sz
lstree
rm dira
tree
undo
tree
ok
errok
okok
okok
okok
okok
okok
okok
9dira
dirb
dirc
root
diraab
cdirb
xdircyok
root
dirb
xdircyok
root
diraab
cdirb
xdirc
y
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
char tmps[50]
;//string型別不能scanf
struct directory
public
: directory*
mkdir
(string name)
;void
maintain
(int x)
;//向上維護子樹大小
directory*
rm(string name)
; directory*
cd(string name)
; directory*
getchild
(string name)
;voidsz(
);voidls(
);void
tree()
;bool
addchild
(directory* d)
;private
:void
treeall
(vector
*v);
//將後代全部加入陣列中
void
treefirstfive
(int n,vector
*v);
//將後代的前五個加入陣列中
void
treelastfive
(int n,vector
*v);
//將後代後五個加入陣列中 };
struct command
;int type;
//型別
string arg;
//引數
directory* tmpdir;
//記錄各操作返回值
command
(string s)
return;}
}};void
solve()
}break
;case1:
//rm
}break
;case2:
//cd
}break
;case3:
//sz
now-
>sz(
);break
;case4:
//ls
now-
>ls(
);break
;case5:
//tree
now-
>
tree()
;break
;case6:
//undo,撤銷上乙個成功執行的操作,操作僅限mkdir\rm\cd
break
;case1:
break
;case2:
break;}
}if(success)
printf
("ok\n");
else
printf
("err\n");
}break;}
}}directory* directory::
mkdir
(string name)
directory* directory::
rm(string name)
directory* directory::
cd(string name)
directory* directory::
getchild
(string name)
void directory::ls(
)}void directory::sz(
)void directory::
maintain
(int x)
bool directory::
addchild
(directory* d)
void directory::
tree()
for(
int i=
0;i)printf
("%s\n"
,tendescen.
at(i)
.c_str()
);}else
for(
int i=
0;i<
5;i++
)printf
("%s\n"
,tendescen.
at(i)
.c_str()
);printf
("...\n");
for(
int i=
9;i>=
5;i--
)printf
("%s\n"
,tendescen.
at(i)
.c_str()
);}}
void directory::
treeall
(vector
* v)
void directory::
treefirstfive
(int n,vector
* v)
else
it++;}
}void directory::
treelastfive
(int n,vector
* v)
else
} v-
>
push_back
(name);}
intmain()
Week9 A 目錄管理器
咕咕東的雪梨電腦的作業系統在上個月受到宇宙射線的影響,時不時發生故障,他受不了了,想要寫乙個高效易用零bug的作業系統 這工程量太大了,所以他定了乙個小目標,從實現乙個目錄管理器開始。前些日子,東東的電腦終於因為過度收到宇宙射線的影響而宕機,無法寫 他的好友tt正忙著在b站看貓片,另一位好友瑞神正忙...
A 咕咕東的目錄管理器
初始時,硬碟是空的,命令列的當前目錄為根目錄 root。目錄管理器可以理解為要維護一棵有根樹結構,每個目錄的兒子必須保持字典序。在命令列下執行以下 中描述的命令 命令 型別 實現 說明 mkdir s 操作 在當前目錄下建立乙個子目錄 s,s 是乙個字串 建立成功輸出 ok 若當前目錄下已有該子目錄...
week9 A 目錄管理器
自己寫乙個目錄管理器,要求可以進行以下的操作。命令型別 實現說明 mkdir s 操作在當前目錄下建立乙個子目錄 s,s 是乙個字串 建立成功輸出 ok 若當前目錄下已有該子目錄則輸出 err rm s 操作在當前目錄下刪除子目錄 s,s 是乙個字串 刪除成功輸出 ok 若當前目錄下該子目錄不存在則...