一、題目
咕咕東的雪梨電腦的作業系統在上個月受到宇宙射線的影響,時不時發生故障,他受不了了,想要寫乙個高效易用零bug的作業系統 —— 這工程量太大了,所以他定了乙個小目標,從實現乙個目錄管理器開始。前些日子,東東的電腦終於因為過度收到宇宙射線的影響而宕機,無法寫**。他的好友tt正忙著在b站看貓片,另一位好友瑞神正忙著打守望先鋒。現在只有你能幫助東東!
初始時,咕咕東的硬碟是空的,命令列的當前目錄為根目錄 root。
目錄管理器可以理解為要維護一棵有根樹結構,每個目錄的兒子必須保持字典序。
現在咕咕東可以在命令列下執行以下**中描述的命令:
二、輸入
輸入檔案包含多組測試資料,第一行輸入乙個整數表示測試資料的組數 t (t <= 20);
每組測試資料的第一行輸入乙個整數表示該組測試資料的命令總數 q (q <= 1e5);
每組測試資料的 2 ~ q+1 行為具體的操作 (mkdir、rm 操作總數不超過 5000);
面對資料範圍你要思考的是他們代表的 「命令」 執行的最大可接受複雜度,只有這樣你才能知道你需要設計的是怎樣複雜度的系統。
三、輸出
每組測試資料的輸出結果間需要輸出一行空行。注意大小寫敏感。
四、樣例輸入輸出
input
1output22mkdir 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 …
szls
tree
rm dira
tree
undo
tree
ok五、解題思路定義目錄結構體,記錄當前目錄的名字、map型別儲存孩子節點、父親節點、size下方所有節點的數目、vector儲存當前節點的十個後代(用於tree操作,後代指下方所有節點)、懶更新控制變數。errok
okok
okok
okok
okok
okok
okok
9dira
dirb
dirc
root
diraab
cdirb
xdircyok
root
dirb
xdircyok
root
diraab
cdirb
xdirc
y
(1)mkdir操作:查詢當前目錄的孩子節點中是否存在該目錄,如果不存在則新建孩子節點,並向上維護子樹的大小,size數加一。
(2)rm操作:查詢當前目錄的孩子節點中是否存在該目錄,如果存在則刪除它,並且向上維護子樹的大小,size數減掉刪除目錄的size值。
(3)cd操作:如果輸入是"。。",判斷當前目錄是不是根目錄,如果不是根目錄,則找到其父親節點。如果輸入是其他, 則判斷當前目錄孩子節點中是否該目錄,如果存在,則找到該輸入目錄。
(4)sz操作:返回當前目錄的size值。
(5)ls操作:判斷孩子節點數目小於10,直接遍歷map輸出。如果大於10,則輸出前五個,再輸出後五個。
(6)tree操作:懶更新。每個目錄利用vector儲存其十個後代。在執行tree操作時,判斷size小於等於10時,如果並未懶更新過,則更新該目錄的vector,將所有後代放入vector中,如果已經懶更新過,則直接輸出vector中元素。判斷size大於10時,如果並未懶更新過,則需要分兩次更新vector,第一次更新前五個,第二次更新後五個。第一次更新時,前序遍歷判斷孩子節點數目大於需要填充的節點數,則終止繼續查詢,當填充5個後,即退出更新。第二次更新時,從最後乙個點開始逆序遍歷,判斷孩子數大於需要填充的節點數,則終止查詢,並從該子樹中取需要相應數目的資料填充至vector中,按照這種查詢方式,應該是最後乙個節點先填充進vector中,輸出時應逆序;如果已經懶更新過,則只需要輸出。
(7)undo操作:定義command結構體,存放指令型別,指令的名字,以及指令操作的目錄。利用command型別的vector存放當前執行成功的mkdir、rm、cd指令,如果為空,則撤銷失敗。當需要撤銷mkdir指令,則呼叫rm刪除新增的目錄;如果需要撤銷rm指令,則再新增刪除的目錄;如果需要撤銷cd指令,則將當前目錄設定為cd前的目錄,這個資訊存放在command結構體中。
六、**樣例
#include
using
namespace std;
char tmps[20]
;struct directory
void
maintain
(int delta)
//向上維護子樹大小
directory *
mkdir
(string name)
bool
addchild
(directory *ch)
//加入子目錄並返回成功與否
directory *
rm(string name)
//刪除目錄並返回,刪除失敗返回空指標
directory *
cd(string name)
else
}else
else}}
voidsz(
)voidls(
)}void
tree()
for(
int i=
0;i)printf
("%s\n"
,ten-
>
at(i)
.c_str()
);}else
for(
int i=
0;i<
5;i++
)printf
("%s\n"
,ten-
>
at(i)
.c_str()
);printf
("...\n");
for(
int i=
9;i>=
5;i--
)printf
("%s\n"
,ten-
>
at(i)
.c_str()
);}}
private
:void
treeall
(vector
* bar)
//更新全桶
void
treefirstsome
(int num,vector
* bar)
//更新前序幾個
else
it++;}
}void
treelastsome
(int num,vector
* bar)
else
} bar-
>
push_back
(name);}
};struct command
;int type;
string name;
directory *tmpdir;
command
(string s)}}
};void
solve()
else
break;}
case2:
else
break;}
case3:
case4:
case5:
case6:
}printf
(ok ?
"ok\n"
:"err\n");
}}}}
intmain()
return0;
}
A 咕咕東的目錄管理器
初始時,硬碟是空的,命令列的當前目錄為根目錄 root。目錄管理器可以理解為要維護一棵有根樹結構,每個目錄的兒子必須保持字典序。在命令列下執行以下 中描述的命令 命令 型別 實現 說明 mkdir s 操作 在當前目錄下建立乙個子目錄 s,s 是乙個字串 建立成功輸出 ok 若當前目錄下已有該子目錄...
week9 作業A 咕咕東的目錄管理器
咕咕東的雪梨電腦的作業系統在上個月受到宇宙射線的影響,時不時發生故障,他受不了了,想要寫乙個高效易用零bug的作業系統 這工程量太大了,所以他定了乙個小目標,從實現乙個目錄管理器開始。前些日子,東東的電腦終於因為過度收到宇宙射線的影響而宕機,無法寫 他的好友tt正忙著在b站看貓片,另一位好友瑞神正忙...
Week9作業 A 咕咕東的目錄管理器 模擬
咕咕東的雪梨電腦的作業系統在上個月受到宇宙射線的影響,時不時發生故障,他受不了了,想要寫乙個高效易用零bug的作業系統 這工程量太大了,所以他定了乙個小目標,從實現乙個目錄管理器開始。前些日子,東東的電腦終於因為過度收到宇宙射線的影響而宕機,無法寫 他的好友tt正忙著在b站看貓片,另一位好友瑞神正忙...