题目背景
题目描述
输入输出
Input
Output
Sample Input
Sample Output
数据规模和约定
思路分析
根据题意,创建element结构体,新建element类型数组e[],用来存储结构化文档中的元素。
从主函数入手,实现输入输出。
输入有两部分:结构化文档和选择器。
读入结构化文档时由于有属性会出现空格,所以使用getline函数直接读入一整行的数据,读入后再用split函数进行分割。
split函数切分:首先用一个for循环遍历整个字符串,找到第一个非’ .'元素的位置s1和属性出现的开头位置s2。将flag置为2,表示有属性。然后用substr()函数生成子字符串。
为每一个选择器进行选择:
首先用toLower函数将输入的结构化文档全部转化为小写,便于后面比较。非后代选择器的查找,只要遍历一遍数组,判断其属性是否符合条件,符合则将其行号插入vector中;对于后代选择器,调用match函数,从被选择元素开始往前,与vector中元素一一对照,直到两边有一边元素对照完毕,如果是vector中元素对照完毕则说明满足条件,否则不满足。将满足条件的行号插入vector中。
最后,ans中存储的是每个选择器对应的元素,直接输出大小和元素即可。
注意
1.每次处理完一个选择器之后要清空容器
2.标签小写化
AC代码
#include<bits/stdc++.h>
using namespace std;
int n=0,m=0;
struct element{
string label; //标签
string id; //属性
int level; //目前元素的层级
}e[110];
vector<string> q; //查询
vector<int> ans;
void toLower(string &t)
{
//转为小写字母
for(int i=0;i<t.size();i++){
if