CCF認證 2018 09 元素選擇器

2021-09-01 23:38:29 字數 1670 閱讀 9589

總結了下,這道題就是個大坑題

兩個方面很坑,一是題意不明確,讓人有誤解,二是資料水,也導致讓人更加不懂題意了

解釋下題意,我最後得出的結果是:

這題應該是讓人構造一棵樹,按照輸入的文字前面的點來劃分層級

對於每行來說,他的父節點應該是向上查詢第乙個點數小於自己的行

例如樣例,應該是這樣一顆樹(按照標籤):

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 建樹 這裡建樹可能有兩個思路,乙個是遞迴建樹,即建樹邊輸入,這個在實際的操可能比較麻煩 可能要回溯到很久以前的結點...