目錄管理器2016 ACM(week9hw)

2021-10-05 15:54:34 字數 4305 閱讀 3708

咕咕東的雪梨電腦的作業系統在上個月受到宇宙射線的影響,時不時發生故障,他受不了了,想要寫乙個高效易用零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 若當前目錄下該子目錄不存在則...