CSP201809 3 元素選擇器 模擬

2021-10-06 07:46:13 字數 1832 閱讀 4380

用point來儲存結構化文件,裡面string label,string id為標籤和id,int c為所在層數,兩個點就為一層。

讀入結構化文件:用getline讀入一行,然後計算出點的個數,層數就為點的個數除以2。接下來讀入label,因為label大小寫不敏感,將其全部轉換為小寫。如果字串還有剩餘,則讀入id。

接下來讀入查詢資訊,然後進行處理,按空格把字串分開,放在vector v裡。然後將v中的所有標籤(不以#開頭)轉換為小寫。再從後往前遍歷結構化文件,找到匹配最後乙個查詢的元素,然後尋找其祖先,如果祖先全部匹配,則該元素符合條件,加入到vector ans中。

因為答案是從後往前放入ans的,所以輸出時要倒序輸出vector ans。

一道稍微複雜一點的模擬題,因為n範圍很小所以不用考慮是否要用複雜度較低的寫法。同時寫過前端的人可以很好的理解題目。

#include

#include

#include

using

namespace std;

int n,m;

struct point

} node[

110]

;vector v;

//存放查詢

vector<

int> ans;

//存放答案

bool

solve

(int

&index,

int&c,

int vv)

//從node[index]開始查詢,層數為c標籤/id為v[vv]

}return

false;}

intmain()

}for

(int i=

1; i<=m; i++

)//讀入查詢

//將標籤變為小寫

for(

int j=

0; j

size()

; j++)if

(v[j][0

]!='#')

for(

int k=

0; k

.size()

; k++)if

(v[j]

[k]>=

'a'&&v[j]

[k]<=

'z')

v[j]

[k]=v[j]

[k]-

'a'+

'a';

//從後往前遍歷,找到匹配最後乙個查詢的元素

//然後尋找其祖先,如果祖先全匹配,則該元素符合條件

for(

int j=n; j>=

1; j--)if

(vv==-1

) ans.

push_back

(j);}}

cout<

size()

;for

(int j=ans.

size()

-1; j>=

0; j--

) cout<<

" "<

; cout<

}}

csp 201809 3 元素選擇器

題目描述 201809 3 試題名稱 元素選擇器 時間限制 1.0s 記憶體限制 256.0mb 題目背景 題目描述 由題可知,結構化文件由元素組成,而這些元素是以一棵樹得形式組織起來的。我們這裡使用結構體來儲存每乙個元素,結構體內包含元素標籤 name 元素id id 元素所在層級 level用於...

csp201809 3 元素選擇器

時間限制 1.0s 空間限制 由於標籤大小寫不敏感,因此在讀取標籤時,首先將標籤的字母全部轉為小寫。建立元素陣列儲存每乙個元素,建立乙個記錄所有id出現的陣列,便於查詢,減少複雜度。在讀取文件資料時,使用vector陣列來儲存上一級元素,用於查詢每個元素的上一級元素。有點類似棧 不是後代選擇器的情況...

CSP 201809 3元素選擇器

題意 模擬元素選擇。分析 id選擇器和標籤選擇器的查詢都比較簡單,稍微麻煩的是後代選擇器。我用了二維陣列儲存每個元素的祖先,第一維代表的是層級 冒號的個數除以2 第二維代表的是序號。多級的後代選擇器在匹配時,可以採用貪心的策略 除最後一級外,前面的部分都可以盡量匹配層級小的元素。如下 include...