week9 作業A 咕咕東的目錄管理器

2021-10-05 04:43:46 字數 3899 閱讀 8842

咕咕東的雪梨電腦的作業系統在上個月受到宇宙射線的影響,時不時發生故障,他受不了了,想要寫乙個高效易用零bug的作業系統 —— 這工程量太大了,所以他定了乙個小目標,從實現乙個目錄管理器開始。前些日子,東東的電腦終於因為過度收到宇宙射線的影響而宕機,無法寫**。他的好友tt正忙著在b站看貓片,另一位好友瑞神正忙著打守望先鋒。現在只有你能幫助東東!

初始時,咕咕東的硬碟是空的,命令列的當前目錄為根目錄 root。

目錄管理器可以理解為要維護一棵有根樹結構,每個目錄的兒子必須保持字典序。

輸入檔案包含多組測試資料,第一行輸入乙個整數表示測試資料的組數 t (t <= 20);

每組測試資料的第一行輸入乙個整數表示該組測試資料的命令總數 q (q <= 1e5);

每組測試資料的 2 ~ q+1 行為具體的操作 (mkdir、rm 操作總數不超過 5000);

面對資料範圍你要思考的是他們代表的 「命令」 執行的最大可接受複雜度,只有這樣你才能知道你需要設計的是怎樣複雜度的系統。

output

每組測試資料的輸出結果間需要輸出一行空行。注意大小寫敏感。

limit

time limit 6000 ms

memory limit 1048576 kb

sample input

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 …

szls

tree

rm dira

tree

undo

tree

sample output

ok

errok

okok

okok

okok

okok

okok

okok

9dira

dirb

dirc

root

diraab

cdirb

xdircyok

root

dirb

xdircyok

root

diraab

cdirb

xdirc

y

我的思路:這道題是一道較為複雜的模擬題,要求我們實現乙個目錄管理器的功能。如果只是暴力的話,時間複雜度會過大,所以在tree和sz上,要做一定的優化。需要在每乙個節點裡設定乙個sz,用於統計以當前節點為根節點的樹的節點個數(包括當前節點,所以每個節點的初始sz值為1)。tree則需要為每個節點設定乙個標籤,判斷是否已經訪問過了,這樣也會節省一些時間。還有要注意的是,rm只是刪除邊而不刪除節點,因為undo操作的存在,保留節點後,rm的undo是直接連上邊就可以了。(注意需要記錄mkdirs、rms和cds的操作,為undo做準備)。

我的總結:

對於一道模擬題,不要直接按照最開始的想法直接coding,而是要觀察一下時間和空間限制,然後對於資料結構和演算法做一下調整,符合題目的限制要求是最重要的。

我的**:

#include

#include

#include

#include

#include

using

namespace std;

int t,q;

struct comm

}cmd;

struct dic

}node[

200000];

int ind,now;

vector

int,

int>

>

> coms;

void

update

(int id,

int numm)

}void

make_node

(string s,

int p)

void

mkdir()

else

cout<<

"err"

<

}voidrm(

)else cout<<

"err"

<

}voidcd(

)else cout<<

"err"

<

}else

else cout<<

"err"

<

voidsz(

)void

undo()

auto st=coms[coms.

size()

-1];

coms.

pop_back()

;int temp=now;

if(st.first==

"mkdir"

)else

if(st.first==

"rm"

)else

cout<<

"ok"

<

}voidls(

)auto pos = node[now]

.mm.

begin()

;if(tt>=

1&&tt<=10)

return;}

for(

int i=

0;i<

5;i++

) cout<<

"..."

<

pos = node[now]

.mm.

end();

for(

int i=

0;i<

5;i++

) pos--

;for

(int i=

0;i<

5;i++)}

void

pushdown

(int x)

;void

pretrack

(int x)

return;}

int pos =1;

for(

auto i : node[x]

.mm)

if(pos >=5)

break;}

}void

bcktrack

(int x)}if

(pos1>=5)

break;if

(pos==node[x]

.mm.

begin()

)break;}

}void

pushdown

(int id)

void

tree()

else

}void

init()

intmain()

}}

Week9作業 A 咕咕東的目錄管理器 模擬

咕咕東的雪梨電腦的作業系統在上個月受到宇宙射線的影響,時不時發生故障,他受不了了,想要寫乙個高效易用零bug的作業系統 這工程量太大了,所以他定了乙個小目標,從實現乙個目錄管理器開始。前些日子,東東的電腦終於因為過度收到宇宙射線的影響而宕機,無法寫 他的好友tt正忙著在b站看貓片,另一位好友瑞神正忙...

WEEK9 A 咕咕東的目錄管理器

咕咕東的雪梨電腦的作業系統在上個月受到宇宙射線的影響,時不時發生故障,他受不了了,想要寫乙個高效易用零bug的作業系統 這工程量太大了,所以他定了乙個小目標,從實現乙個目錄管理器開始。前些日子,東東的電腦終於因為過度收到宇宙射線的影響而宕機,無法寫 他的好友tt正忙著在b站看貓片,另一位好友瑞神正忙...

程式設計Week9 A 咕咕東的目錄管理器

每組測試資料的輸出結果間需要輸出一行空行。注意大小寫敏感。以封裝的思想來實現每個小功能,由於有undo的操作,因此對於mkdir rm cd三種操作需要記錄每一次操作的過程 建立乙個目錄相關的結構體,其中包括檔名,當前檔案的子目錄的map,父節點以及當前檔案下子樹 目錄 的規模,當前目錄下先序遍歷 ...