題目所給出的結構化文件是乙個樹形結構,但由於其輸入中使用的是小數點的數量來計算層次,因此我們可以構建乙個結構體來儲存每行的元素。
#include
using
namespace std;
struct node
;
由於元素標籤是不區分大小寫的,因此不論是每個元素結構體的name,還是後面選擇器的name查詢,都統一使用乙個函式來將整個字串變成小寫的,以省事。
void
tolow
(string& a)
}
在輸入的時候,根據題目的規則,依次將每一行的元素處理成乙個結構體,如果沒有id的話成員變數id就留空即可。使用乙個陣列儲存這些結構體,在接下來選擇器匹配的時候可以保證順序不變從而模擬樹形結構。
對於選擇器的查詢,關鍵點(難點)其實是多級選擇器,如果只是單獨乙個選擇器的話直接在上面那個元素結構體陣列裡嘗試匹配即可。
這裡就出現了乙個史詩級誤導:題目描述中,對於後代選擇器的定義為:
復合表示式,格式為a b,其中a和b均為標籤選擇器或id選擇器這句話在中文上有兩種解釋:
a和b都是標籤選擇器,或者a和b都是id選擇器,即a與b的選擇器型別一定相同。
a可以是標籤選擇器或者是id選擇器,b也可以是標籤選擇器或者是id選擇器,a與b的選擇器型別不一定相同。
卡在80分就是這裡的問題了。結果顯示csp官方對這道題這個定義的理解屬於後者。(可第二個解釋不是廢話嗎啊喂,總共就倆選擇器啊)
那麼如何匹配多級選擇器呢?
首先我們使用乙個vector來儲存輸入的選擇器的各個單詞,如果只有乙個單詞說明不是後代選擇器,直接搜尋就行了。如果這個vector陣列的大小大於1,則說明是後代選擇器了:
這道題其實不是很難,主要是匹配不要昏掉,然後就是上面那個後代選擇器的定義的問題。
下面給出滿分**:
#include
#include
#include
#include
using
namespace std;
void
tolow
(string& a)
}struct node};
vectornode;
bool
check
(int pos,
const vector
& cmd)
//傳入要檢測的節點的位置,和需要用來檢測的後代選擇器陣列
}return
false;}
intmain()
} size_t fi = input.
find
(' '
, index);if
(fi != input.npos)
else name = input.
substr
(index);
node.
push_back
(node
(name, index /
2, id));
}for
(int h =
0; h < m; h++
)else
}//將所有的標籤選擇器全部改為小寫字母
for(
int i =
0; i < cmd.
size()
; i++)if
(cmd[i][0
]!='#')
tolow
(cmd[i]);
vector<
int>ans;
//答案陣列
for(
int i =
0; i < node.
size()
; i++)}
else}}
cout << ans.
size()
;for
(int i =
0; i < ans.
size()
; i++
) cout << endl;
}return0;
}
CCF CSP題解 201809 3 元素選擇器
題目要求寫乙個簡易的css selector。首先用結構體 儲存元素。其中 lev 表示元素在html樹中的深度 這個是因為邏輯凌亂才加上的 接著用鏈式前向星儲存html元素樹。這裡用乙個棧 rootstack 方便找到新元素的父親節點 temp 三種選擇器都可以歸結為第三種方式 後代選擇器。題目裡...
201809 3 元素選擇器
ccf201809的第三題 題目就不粘上來了!設計思路 首先要用乙個結構體來儲存每一行文件,有等級 標籤以及id。其次需要注意的是標籤不區分大小寫!對於選擇器,大致可以分為兩種,第一種是只有單個的標籤或者id,這種直接遍歷文件即可 也就是我們處理過後的結點陣列 第二種是分層的,這種我們需要從選擇器的...
201809 3 元素選擇器
模擬題,細心細心再細心,整個結構是乙個樹型的結構。include include include include include includeusing namespace std typedef long long ll const int inf 0x3f3f3f3f const double...