總結了下,這道題就是個大坑題
兩個方面很坑,一是題意不明確,讓人有誤解,二是資料水,也導致讓人更加不懂題意了
解釋下題意,我最後得出的結果是:
這題應該是讓人構造一棵樹,按照輸入的文字前面的點來劃分層級
對於每行來說,他的父節點應該是向上查詢第乙個點數小於自己的行
例如樣例,應該是這樣一顆樹(按照標籤):
html
head body
title h1 p div
h2 p div
p構建好之後,處理選擇器
不是後代選擇器的話,直接遍歷一遍,看看符合的有哪些
如果是後代選擇器,就把每個詞先處理出來,然後用dfs在樹中查詢
(注意,後代選擇器可以同時出現標籤和id,也就是可以兩種標籤巢狀,這也是乙個坑
題目中說後代選擇器中的a b是同一種選擇器,就算是多級,按照相等傳遞性應該都是同一種,但不是)
dfs由總根開始,遇到標籤就匹配標籤,否則匹配id,我寫了兩個dfs函式來處理這種轉換
按照前面處理的詞從前到後按照貪心匹配,當把所有詞匹配完,就說明這個點是乙個答案
還有一些應該注意的地方,見**,最後把答案排一次序,確保從小到大輸出
還有當我遇到坑卡住的時候,去搜了下別人的**,發現對題的理解根本不一樣
他們後代選擇器的處理,就是簡單的找到最後乙個詞的匹配,然後檢查之前的行是否能湊夠前面的詞
能行就算答案,這樣完全沒有考慮層級,順序,也沒有考慮是不是祖先的方法,竟然也是100分
這應該是資料太水的原因
#include#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
const int n=100+10;
struct node
tree[n]; //儲存節點資訊
vectorg[n];//鄰接表
stacks;
int pre[n]; //儲存每行的字首點個數
int n,m;
int cnt,ans[n]; //儲存答案
int num; //選擇器層數
string str[n]; //儲存選擇器單詞
void dfs_id(int u,int d);
void dfs_name(int u,int d) //匹配標籤
while(m--)
else str[num]+=in[i];
}if(str[num]=="") num--;
for(int i=0;i<=num;i++)
if(str[i][0]!='#') //將標籤化為小寫
for(int j=0;jstr[i][j]=tolower(str[i][j]);
cnt=0;
if(num==0)
else
}else //後代選擇器
else
}sort(ans,ans+cnt);
printf("%d",cnt);
for(int i=0;iprintf(" %d",ans[i]);
printf("\n");
}return 0;
}
CCF認證 201809 3元素選擇器
大模擬 1 儲存 2 查詢 整體來看是樹形結構 總結 結構體建立 struct element vectorelements 105 級數另外儲存 vector series series 0 2 3 表示行號為3的元素的級數為0 element 3 讀取輸入 c getline函式讀取一行字串,行...
CCF 20180903 元素選擇器
題意 找出給定html文件的對應元素所在位置。分析 字串問題大模擬,ccf經典題。這道題只得了80分,還在找bug。include using namespace std const int maxn 111 struct item html文件 item maxn int fa maxn 當前元素...
CCF201809 3 元素選擇器
中文題見題面 其實一看到那個文件的表示方式,就很容易想到可以用一顆數來表示,查詢時直接遍歷樹即可。1 樹結點 每個節點儲存一行的標籤和id屬性,其結點編號為所在行號,即每行乙個結點。2 建樹 這裡建樹可能有兩個思路,乙個是遞迴建樹,即建樹邊輸入,這個在實際的操可能比較麻煩 可能要回溯到很久以前的結點...