咕咕東的雪梨電腦的作業系統在上個月受到宇宙射線的影響,時不時發生故障,他受不了了,想要寫乙個高效易用零bug的作業系統 —— 這工程量太大了,所以他定了乙個小目標,從實現乙個目錄管理器開始。前些日子,東東的電腦終於因為過度收到宇宙射線的影響而宕機,無法寫**。他的好友tt正忙著在b站看貓片,另一位好友瑞神正忙著打守望先鋒。現在只有你能幫助東東!初始時,咕咕東的硬碟是空的,命令列的當前目錄為根目錄 root。
目錄管理器可以理解為要維護一棵有根樹結構,每個目錄的兒子必須保持字典序。
輸入檔案包含多組測試資料,第一行輸入乙個整數表示測試資料的組數 t (t <= 20);output每組測試資料的第一行輸入乙個整數表示該組測試資料的命令總數 q (q <= 1e5);
每組測試資料的 2 ~ q+1 行為具體的操作 (mkdir、rm 操作總數不超過 5000);
面對資料範圍你要思考的是他們代表的 「命令」 執行的最大可接受複雜度,只有這樣你才能知道你需要設計的是怎樣複雜度的系統。
每組測試資料的輸出結果間需要輸出一行空行。注意大小寫敏感。limittime limit 6000 mssample inputmemory limit 1048576 kb
1sample output22mkdir 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我的思路:這道題是一道較為複雜的模擬題,要求我們實現乙個目錄管理器的功能。如果只是暴力的話,時間複雜度會過大,所以在tree和sz上,要做一定的優化。需要在每乙個節點裡設定乙個sz,用於統計以當前節點為根節點的樹的節點個數(包括當前節點,所以每個節點的初始sz值為1)。tree則需要為每個節點設定乙個標籤,判斷是否已經訪問過了,這樣也會節省一些時間。還有要注意的是,rm只是刪除邊而不刪除節點,因為undo操作的存在,保留節點後,rm的undo是直接連上邊就可以了。(注意需要記錄mkdirs、rms和cds的操作,為undo做準備)。errok
okok
okok
okok
okok
okok
okok
9dira
dirb
dirc
root
diraab
cdirb
xdircyok
root
dirb
xdircyok
root
diraab
cdirb
xdirc
y
我的總結:
對於一道模擬題,不要直接按照最開始的想法直接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,父節點以及當前檔案下子樹 目錄 的規模,當前目錄下先序遍歷 ...