week15——实验(月模拟题4(CSP201809|week15——实验(月模拟题4:CSP201809 03))


目录

    • 元素选择器 :
      • 问题描述
          • 题目简述
      • 问题分析
          • 解题思路
          • 参考代码
      • 心得体会

元素选择器 : 问题描述
题目简述 【week15——实验(月模拟题4(CSP201809|week15——实验(月模拟题4:CSP201809 03))】week15——实验(月模拟题4(CSP201809|week15——实验(月模拟题4:CSP201809 03))
文章图片

week15——实验(月模拟题4(CSP201809|week15——实验(月模拟题4:CSP201809 03))
文章图片

week15——实验(月模拟题4(CSP201809|week15——实验(月模拟题4:CSP201809 03))
文章图片

week15——实验(月模拟题4(CSP201809|week15——实验(月模拟题4:CSP201809 03))
文章图片

问题分析
解题思路 本题要求实现3个不同类型的html元素选择器。实际上,通过分析可以发现,这三种选择器可以统一成一种情况,因为如果将“#”看成匹配的一部分的话,标签选择器和id选择器是一样的,而后代选择器,相当于一次选取多个有包含顺序的标签,因此,其本质上是一个标签选择器。因此,这三种选择器用一种方法即可实现。我的思路是先从最低级的元素开始匹配,当匹配到该元素时,如果是标签和id选择器,该搜索过程已经结束,但对于后代选择器,需要继续匹配外层的标签,而其父代一定位于当前匹配的元素之前,因此,需要通过循环继续匹配,从当前位置开始,每次匹配若成功匹配一层,那么就将起始位置改为该位置,并匹配下一层,直到匹配完全为止。其他两个选择器不需要进行此循环。
以上是匹配部分,之后就是字符串的处理,首先对于输入的html代码,需要去掉内容前的“."并统计数量,之后找到标签和属性的起始位置。将以上信息保存到一个结构体中即可。对于输入的查询,需要将各部分分隔开的空格去掉,使用stringstream即可完美解决。
之后问题就解决了。
参考代码 week15——实验(月模拟题4(CSP201809|week15——实验(月模拟题4:CSP201809 03))
文章图片

#include #include #include #include using namespace std; class elements { public: string label; string id; int count; }; void string_lower(string& s) { for(int i=0; i.length(); i++) { s[i]=tolower(s[i]); } }bool search(elements e[],int& start,int& count,string s) { for(int i=start; i>=1; i--) { if(e[i].count>n>>m; getchar(); for(int i=1; i<=n; i++) { string ss; getline(cin,ss); //cout v; vector ans; stringstream in(ss); string temp; while(in>>temp) { v.push_back(temp); } int len=v.size(); for(int i=0; i=0; k--) { if(!search(element,start,count,v[k])) break; } if(k<0) ans.push_back(j); } } cout<

心得体会
这个题我想了很久才想出来这个方法,最后AC了也是非常的高兴。模拟题还是要多练,感觉做题的时候思路还不算很清晰,还是要继续练习。

    推荐阅读