csp 201604 3 題目總結回顧

2021-10-04 16:11:42 字數 3166 閱讀 6297

試題編號: 201604-3

試題名稱: 路徑解析

時間限制: 1.0s

記憶體限制: 256.0mb

問題描述:

問題描述

在作業系統中,資料通常以檔案的形式儲存在檔案系統中。檔案系統一般採用層次化的組織形式,由目錄(或者資料夾)和檔案構成,形成一棵樹的形狀。檔案有內容,用於儲存資料。目錄是容器,可包含檔案或其他目錄。同乙個目錄下的所有檔案和目錄的名字各不相同,不同目錄下可以有名字相同的檔案或目錄。

為了指定檔案系統中的某個檔案,需要用路徑來定位。在類 unix 系統(linux、max os x、freebsd等)中,路徑由若干部分構成,每個部分是乙個目錄或者檔案的名字,相鄰兩個部分之間用 / 符號分隔。

有乙個特殊的目錄被稱為根目錄,是整個檔案系統形成的這棵樹的根節點,用乙個單獨的 / 符號表示。在作業系統中,有當前目錄的概念,表示使用者目前正在工作的目錄。根據出發點可以把路徑分為兩類:

絕對路徑:以 / 符號開頭,表示從根目錄開始構建的路徑。

相對路徑:不以 / 符號開頭,表示從當前目錄開始構建的路徑。

例如,有乙個檔案系統的結構如下圖所示。在這個檔案系統中,有根目錄 / 和其他普通目錄 d1、d2、d3、d4,以及檔案 f1、f2、f3、f1、f4。其中,兩個 f1 是同名檔案,但在不同的目錄下。

對於 d4 目錄下的 f1 檔案,可以用絕對路徑 /d2/d4/f1 來指定。如果當前目錄是 /d2/d3,這個檔案也可以用相對路徑 …/d4/f1 來指定,這裡 … 表示上一級目錄(注意,根目錄的上一級目錄是它本身)。還有 . 表示本目錄,例如 /d1/./f1 指定的就是 /d1/f1。注意,如果有多個連續的 / 出現,其效果等同於乙個 /,例如 /d1///f1 指定的也是 /d1/f1。

本題會給出一些路徑,要求對於每個路徑,給出正規化以後的形式。乙個路徑經過正規化操作後,其指定的檔案不變,但是會變成乙個不包含 . 和 … 的絕對路徑,且不包含連續多個 / 符號。如果乙個路徑以 / 結尾,那麼它代表的一定是乙個目錄,正規化操作要去掉結尾的 /。若這個路徑代表根目錄,則正規化操作的結果是 /。若路徑為空字串,則正規化操作的結果是當前目錄。

輸入格式

第一行包含乙個整數 p,表示需要進行正規化操作的路徑個數。

第二行包含乙個字串,表示當前目錄。

以下 p 行,每行包含乙個字串,表示需要進行正規化操作的路徑。

輸出格式

共 p 行,每行乙個字串,表示經過正規化操作後的路徑,順序與輸入對應。

樣例輸入

7/d2/d3

/d2/d4/f1

…/d4/f1

/d1/./f1

/d1///f1

/d1/

////d1/…/…/d2

樣例輸出

/d2/d4/f1

/d2/d4/f1

/d1/f1

/d1/f1

/d1/

/d2評測用例規模與約定

1 ≤ p ≤ 10。

檔案和目錄的名字只包含大小寫字母、數字和小數點 .、減號 - 以及下劃線 _。

不會有檔案或目錄的名字是 . 或 … ,它們具有題目描述中給出的特殊含義。

輸入的所有路徑每個長度不超過 1000 個字元。

輸入的當前目錄保證是乙個經過正規化操作後的路徑。

對於前 30% 的測試用例,需要正規化的路徑的組成部分不包含 . 和 … 。

對於前 60% 的測試用例,需要正規化的路徑都是絕對路徑。

本題輸入分為三項,第一項是需要正規化路徑的數目,第二項是當前目錄,第三項是依次輸入需要正規化的路徑。需要正規化的路徑有兩種給出形式:

給出的路徑中會包含".." 和 「.」 這種特殊字元。其中 ".. " 表示上一級目錄(注意,根目錄的上一級目錄是它本身)。 "."表示本目錄,例如 /d1/./f1 指定的就是 /d1/f1。

同時題目還給出了以下的正規化規則:

最終需要輸出所有路徑正規化後的結果。

本題為一道csp模擬題,題意理解有一定難度,但只要細緻讀題便可以發現規律,從而簡便求解。首先可以先將相對路徑轉化為絕對路徑的形式,即在相對路徑前加上當前目錄路徑,但是要注意這個並不是絕對路徑,只是形式上相似,還有細節需要處理。之後以"\" 符號為邊界劃分路徑,對分段結果可以大體分為以下幾種操作:

大體操作和思路已經得出,接下來就需要考慮實現方法。這裡需要使用 getline() + stringstrream 的方法來實現,這種操作不是很常見,但是也需要掌握,關鍵時刻非常有用。getline() 可以讀入字串,不受換行、轉義字元等影響,這在本題中非常關鍵,同時在擷取時也可以使用 getline() 函式,例如 getline(temp,ss,』/』) 表示用"\"分割temp,每次分割結果存在ss中。這種方法的運用使得解題變得十分簡便,是本題的關鍵之處。

#include

#include

#include

#include

#include

#include

#define maxn 100005

using

namespace std;

intmain

(int argc,

char

** ar**)

if(code[0]

!='/'

)//不是從根目錄開始

vector v;

stringstream temp

(code)

; string ss;

while

(getline

(temp,ss,

'/')

)//表示以"/"為邊界擷取字串temp,並將擷取結果放入ss

else

if(ss ==

".."

&&!v.

empty()

)else

if(ss !=

"..")}

if(v.

empty()

)//結果為空串情況

for(

int i =

0; i < v.

size()

; i++

) cout << endl;

}return0;

}

CSP 201604 3 路徑解析

試題編號 201604 3 試題名稱 路徑解析 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 在作業系統中,資料通常以檔案的形式儲存在檔案系統中。檔案系統一般採用層次化的組織形式,由目錄 或者資料夾 和檔案構成,形成一棵樹的形狀。檔案有內容,用於儲存資料。目錄是容器,可包含檔案...

CSP201604 3路徑解析

給出一系列檔案路徑,輸出正規化後的路徑。有分析可知,給出的路徑只有兩種形式,一是絕對路徑 以 開頭 二是相對路徑 以 開頭 對於相對路徑的處理,可以將它與當前目錄連在一起,變成絕對路徑後再正規化,根據分析得出將乙個路徑 絕對路徑 正規化要考慮到以下四點 路徑中是否出現 路徑中是否出現 路徑中是否出現...

CSP 201604 3路徑解析

問題描述 輸入格式 第一行包含乙個整數 p,表示需要進行正規化操作的路徑個數。第二行包含乙個字串,表示當前目錄。以下 p 行,每行包含乙個字串,表示需要進行正規化操作的路徑。輸出格式 共 p 行,每行乙個字串,表示經過正規化操作後的路徑,順序與輸入對應。樣例輸入 7 d2 d3 d2 d4 f1 d...