用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...