問題解決方法過程及結構如下圖所示
其中,read負責讀取層疊樣式資訊,read_query負責讀取查詢資訊(讀取一條處理一條),query負責處理一條查詢資訊,query_one負責處理元素標籤選擇器和id選擇器,query_muti負責處理後代選擇器。lwr可以將乙個字串中所有的大寫字母變為小寫,並返回。
層疊樣式資訊儲存在陣列ele[2][1000]中,其中ele[0][i]表示第i行的標籤名,ele[1][i]表示第i行的id(若不存在則為空字串)。另外,第i行的級數(也就是第i行 『.』 的數量除以2)儲存在lv[i]中。
該函式的引數如下表所示:
型別名稱
注釋string &
s要查詢的標籤名或id
intst
表示查詢的起始位置,在st行標籤的子標籤中查詢
int &
resn
用來統計符合要求的標籤數量
int
lines
用來儲存所有符合要求標籤的行號(從小到大公升序儲存)
該函式思路比較簡單,只需從st+1行開始依次向下搜尋,如果搜尋到第i行,該行的級數lv[i]≥lv[st],說明已經找完了st行標籤的所有子標籤,查詢完畢。
對於每乙個子標籤i(第i行的標籤):
如果符合要求,那麼將i存入lines[resn],resn加1。
最後返回是否找到了符合要求的標籤(bool型別)。
該函式的引數如下表所示:
型別名稱
注釋string
s依次儲存每一級的選擇器
intn
級數,及s陣列元素個數
intst
表示查詢的起始位置,在st行標籤的子標籤中查詢
intidx
當前查詢使用的選擇器(標籤或id)在s陣列中的索引號
int &
resn
用來統計符合要求的標籤數量
int
lines
用來儲存所有符合要求標籤的行號(從小到大公升序儲存)
這個函式是乙個遞迴函式。
如果當前要使用的選擇器是陣列中最後乙個(idx == n-1),那麼直接呼叫query_one進行查詢,並將query_one的結果(是否找到)返回。
否則,從st+1行開始尋找是否有符合要求的子標籤,遍歷及查詢方式與query_one相同。對於遍歷到的乙個符合要求的標籤i,呼叫函式query_muti(s, n, i, idx+1, resn, lines),並記錄返回值。若返回true,那麼本函式執行結束,返回true,否則繼續遍歷。若一直未找到符合要求的子標籤,返回false。
lwr、query、read、read_query思路見源**。利用query_one或query_muti處理後,最後按要求輸出resn和lines即可。
#include
#include
#include
using
namespace std;
int n, m;
string ele[2]
[1000];
int lv[
1000];
string lwr
(const string &s)
return res;
}void
read()
//讀取元素內容
ele[0]
[i]=
lwr(ele[0]
[i])
; lv[i]/=
2;}}
bool
query_one
(string &s,
int st,
int&resn,
int lines)
//處理單級選擇器
}return flag;
}bool
query_muti
(string s,
int n,
int st,
int idx,
int&resn,
int lines)
//處理多級選擇器
}return
false;}
}void
query
(string s,
int n)
//負責處理所有選擇器
void
read_query()
//讀取查詢資訊並查新
j++;query
(s, j);}
}int main ()/*
11 5
html
..head
....title
..body
....h1
....p #subtitle
....div #main
......h2
......p #one
......div
........p #two
p#subtitle
h3div p
div div p
*/
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...