咕咕東的雪梨電腦的作業系統在上個月受到宇宙射線的影響,時不時發生故障,他受不了了,想要寫乙個高效易用零bug的作業系統 —— 這工程量太大了,所以他定了乙個小目標,從實現乙個目錄管理器開始。前些日子,東東的電腦終於因為過度收到宇宙射線的影響而宕機,無法寫**。他的好友tt正忙著在b站看貓片,另一位好友瑞神正忙著打守望先鋒。現在只有你能幫助東東!
初始時,咕咕東的硬碟是空的,命令列的當前目錄為根目錄 root。
目錄管理器可以理解為要維護一棵有根樹結構,每個目錄的兒子必須保持字典序。
現在咕咕東可以在命令列下執行以下**中描述的命令:
mkdir s 操作 在當前目錄下建立乙個子目錄 s,s 是乙個字串 建立成功輸出 「ok」;若當前目錄下已有該子目錄則輸出 「err」
rm s 操作 在當前目錄下刪除子目錄 s,s 是乙個字串 刪除成功輸出 「ok」;若當前目錄下該子目錄不存在則輸出 「err」
cd s 操作 進入乙個子目錄 s,s 是乙個字串(執行後,當前目錄可能會改變) 進入成功輸出 「ok」;若當前目錄下該子目錄不存在則輸出 「err」
特殊地,若 s 等於 「…」 則表示返回上級目錄,同理,返回成功輸出 「ok」,返回失敗(當前目錄已是根目錄沒有上級目錄)則輸出 「err」
sz 詢問 輸出當前目錄的大小 也即輸出 1+當前目錄的子目錄數
ls 詢問 輸出多行表示當前目錄的 「直接子目錄」 名 若沒有子目錄,則輸出 「empty」;若子目錄數屬於 [1,10] 則全部輸出;若子目錄數大於 10,則輸出前 5 個,再輸出一行 「…」,輸出後 5 個。
tree 詢問 輸出多行表示以當前目錄為根的子樹的前序遍歷結果 若沒有後代目錄,則輸出 「empty」;若後代目錄數+1(當前目錄)屬於 [1,10] 則全部輸出;若後代目錄數+1(當前目錄)大於 10,則輸出前 5 個,再輸出一行 「…」,輸出後 5 個。若目錄結構如上圖,當前目錄為 「root」 執行結果如下
undo 特殊 撤銷操作 撤銷最近乙個 「成功執行」 的操作(即mkdir或rm或cd)的影響,撤銷成功輸出 「ok」 失敗或者沒有操作用於撤銷則輸出 「err」
輸入
輸入檔案包含多組測試資料,第一行輸入乙個整數表示測試資料的組數 t (t <= 20);輸出每組測試資料的第一行輸入乙個整數表示該組測試資料的命令總數 q (q <= 1e5);
每組測試資料的 2 ~ q+1 行為具體的操作 (mkdir、rm 操作總數不超過 5000);
面對資料範圍你要思考的是他們代表的 「命令」 執行的最大可接受複雜度,只有這樣你才能知道你需要設計的是怎樣複雜度的系統。
每組測試資料的輸出結果間需要輸出一行空行。注意大小寫敏感。樣例輸入
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
題目特別複雜,各種操作。**是參考的課件,思路也是順著來的。
把路徑設定為乙個樹形的結構,因為子節點要保持字典序,所以使用map容器,儲存乙個指標指向父路徑,使用string儲存路徑名稱。
這裡採用物件導向的思想,把對目錄的操作設定為類的各種方法。
由於存在undo操作,因此這裡需要對操作成功的,可撤銷的操作進行儲存,這裡使用vector容器儲存可撤銷的命令。
對於tree操作,需要根據子目錄的數量進行判斷使用不同的遍歷操作,且由輸入規模可知,該樹節點數量不會超過5000,但命令數量多達1e5所以可能出現連續的tree操作,因此,這裡在每個目錄使用乙個vector容器儲存tree操作的輸出,並使用乙個標誌update判斷該目錄是否被更改,若未更改,則遇到tree操作時可直接輸出上次的輸出結果,以達到減少時間複雜度的目的。
#include
#include
#include
#include
using
namespace std;
const string cmds[7]
=;string temp;
struct direct
public
: direct*
getchild
(string s)
bool
addchild
(direct* ch)
else
}void
maintain
(int d)
} direct*
mkdir
(string name)
} direct*
rm(string name)
} direct*
cd(string name)
else
}voidsz(
)voidls(
)}void
tree()
for(
int i =
0; i < ten.
size()
; 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
treefirst
(int num, vector
* bar)
else
it++;}
}void
treelast
(int num, vector
* bar)
else
} bar-
>
push_back
(name);}
};struct command }if
(type <3)
cin >> temp, arg = temp;}}
;void
solve()
break
;case1:
cmd-
>tempdir = now-
>
rm(cmd-
>arg);if
(cmd-
>tempdir ==
null
)printf
("err\n");
else
break
;case2:
//cd.
t = now-
>
cd(cmd-
>arg);if
(t ==
null
)printf
("err\n");
else
break
;case3:
//sz
now-
>sz(
);break
;case4:
//ls
now-
>ls(
);break
;case5:
//tree
now-
>
tree()
;break
;case6:
//undo }
printf
(suc ?
"ok\n"
:"err\n");
break;}
}}}int
main()
week9 A 目錄管理器
自己寫乙個目錄管理器,要求可以進行以下的操作。命令型別 實現說明 mkdir s 操作在當前目錄下建立乙個子目錄 s,s 是乙個字串 建立成功輸出 ok 若當前目錄下已有該子目錄則輸出 err rm s 操作在當前目錄下刪除子目錄 s,s 是乙個字串 刪除成功輸出 ok 若當前目錄下該子目錄不存在則...
WEEK9 A 咕咕東的目錄管理器
咕咕東的雪梨電腦的作業系統在上個月受到宇宙射線的影響,時不時發生故障,他受不了了,想要寫乙個高效易用零bug的作業系統 這工程量太大了,所以他定了乙個小目標,從實現乙個目錄管理器開始。前些日子,東東的電腦終於因為過度收到宇宙射線的影響而宕機,無法寫 他的好友tt正忙著在b站看貓片,另一位好友瑞神正忙...
程式設計Week9 A 咕咕東的目錄管理器
每組測試資料的輸出結果間需要輸出一行空行。注意大小寫敏感。以封裝的思想來實現每個小功能,由於有undo的操作,因此對於mkdir rm cd三種操作需要記錄每一次操作的過程 建立乙個目錄相關的結構體,其中包括檔名,當前檔案的子目錄的map,父節點以及當前檔案下子樹 目錄 的規模,當前目錄下先序遍歷 ...