week15——实验(月模拟题4(CSP201809|week15——实验(月模拟题4:CSP201809 03))
目录
- 元素选择器 :
- 问题描述
- 题目简述
- 问题分析
- 解题思路
- 参考代码
- 心得体会
元素选择器 : 问题描述
题目简述 【week15——实验(月模拟题4(CSP201809|week15——实验(月模拟题4:CSP201809 03))】
文章图片
文章图片
文章图片
文章图片
问题分析
解题思路 本题要求实现3个不同类型的html元素选择器。实际上,通过分析可以发现,这三种选择器可以统一成一种情况,因为如果将“#”看成匹配的一部分的话,标签选择器和id选择器是一样的,而后代选择器,相当于一次选取多个有包含顺序的标签,因此,其本质上是一个标签选择器。因此,这三种选择器用一种方法即可实现。我的思路是先从最低级的元素开始匹配,当匹配到该元素时,如果是标签和id选择器,该搜索过程已经结束,但对于后代选择器,需要继续匹配外层的标签,而其父代一定位于当前匹配的元素之前,因此,需要通过循环继续匹配,从当前位置开始,每次匹配若成功匹配一层,那么就将起始位置改为该位置,并匹配下一层,直到匹配完全为止。其他两个选择器不需要进行此循环。
以上是匹配部分,之后就是字符串的处理,首先对于输入的html代码,需要去掉内容前的“."并统计数量,之后找到标签和属性的起始位置。将以上信息保存到一个结构体中即可。对于输入的查询,需要将各部分分隔开的空格去掉,使用stringstream即可完美解决。
之后问题就解决了。
参考代码
文章图片
#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了也是非常的高兴。模拟题还是要多练,感觉做题的时候思路还不算很清晰,还是要继续练习。
推荐阅读
- 急于表达——往往欲速则不达
- 慢慢的美丽
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 2019-02-13——今天谈梦想()
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- Ⅴ爱阅读,亲子互动——打卡第178天
- 低头思故乡——只是因为睡不着
- 取名——兰
- 每日一话(49)——一位清华教授在朋友圈给大学生的9条建议
- 广角叙述|广角叙述 展众生群像——试析鲁迅《示众》的展示艺术