(中文題見題面)。
其實一看到那個文件的表示方式,就很容易想到可以用一顆數來表示,查詢時直接遍歷樹即可。
1、樹結點:每個節點儲存一行的標籤和id屬性,其結點編號為所在行號,即每行乙個結點。
2、建樹:這裡建樹可能有兩個思路,乙個是遞迴建樹,即建樹邊輸入,這個在實際的操可能比較麻煩(可能要回溯到很久以前的結點),另乙個是插入式,即每輸入一行將對應資訊插入到對應的位置,這裡考慮如何找到插入的位置:由於每乙個結點編號都是乙個行號,我們在插入某乙個結點時,只要知道其前一級(最近的祖先元素)的那一行對應的行號(用乙個陣列進行儲存和更新即可),然後遍歷樹找到對應結點,再插入到後面即可。
3、查詢:對於非復合的查詢直接遍歷樹的所有結點,判斷結點資訊是否滿足查詢,滿足就儲存編號。對於復合查詢,我們遍歷樹的時候在路徑上依次匹配,即按照提示的所說的貪心地去匹配即可,當除了最後乙個之外全部匹配完以後,將後面的可以與最後一項匹配的結點編號全部儲存即可。
實際上這兩種操作再進行匹配時可以統一,具體見**。
4、輸出。
#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
const int maxn=201;
void norm_tag(string &s)
struct tree_node
};struct tree
void insert(string _tag,string _id,int lv,int rt,int pos)
for(int i=0;i>n>>m;
string str;getchar();
for(int i=0;i>ss)
solve.ans.clear();solve.query(s,t,0,0);solve.output();
}return 0;
}
相對而言是比較簡單的第三題了,但是當時想著遞迴建樹...,然後一直沒寫出來。
也不一定見得要建樹,實際上直接用陣列去模擬也挺簡單的,最後就這麼寫騙了點分。
當時有點寫鬱悶了,一直建不出樹。
CCF 201809 3 元素選擇器
試題編號 201809 3 試題名稱 元素選擇器 時間限制 1.0s 記憶體限制 256.0mb 問題描述 本 採用非遞迴暴力迴圈匹配 注意題目 標籤大小寫不敏感,id大小寫敏感 include define pb emplace back using namespace std const int...
CCF認證 201809 3元素選擇器
大模擬 1 儲存 2 查詢 整體來看是樹形結構 總結 結構體建立 struct element vectorelements 105 級數另外儲存 vector series series 0 2 3 表示行號為3的元素的級數為0 element 3 讀取輸入 c getline函式讀取一行字串,行...
201809 3 元素選擇器
ccf201809的第三題 題目就不粘上來了!設計思路 首先要用乙個結構體來儲存每一行文件,有等級 標籤以及id。其次需要注意的是標籤不區分大小寫!對於選擇器,大致可以分為兩種,第一種是只有單個的標籤或者id,這種直接遍歷文件即可 也就是我們處理過後的結點陣列 第二種是分層的,這種我們需要從選擇器的...