本文主要是介绍csp月模拟 201809-3 元素选择器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
csp月模拟 201809-3 元素选择器
- 题目
- 题解
- c++代码:
题目
题解
1.本题模拟了css的dom树查找操作,但实际上并不需要建树(有点复杂),我们可以直接根据层级的深度来模拟树的层级关系
2.我们观察可以发现对于查找来说 如果我们匹配到最后一个标签(id)那么我们只要可以在他前面找到到达这个标签的路径就可以了(逆序找路层级(cnt)递减)
注意:仅仅对标签大小写不敏感但是对于id大小写敏感(不然只有90分)
c++代码:
#include<iostream>
#include<string>
#include<string.h>
#include<vector>using namespace std;const int N=105;struct Node{string lable,id;//标签和属性 int cnt;//缩进
}a[N];string toLower(string str){if(str[0] == '#') return str; for(int i=0;i<str.length();i++){if(str[i] >= 'A' && str[i] <= 'Z')str[i] = str[i] - 'A' + 'a';}return str;
}vector<string> query(0);//存储查询
vector<int> ans(0);//存储结果 bool search(Node a[],int &start,int &cnt,string s)
{for(int i=start;i>=1;i--)//遍历 {if(a[i].cnt<cnt) {cnt=a[i].cnt;start=i;//逆序需要更新cnt if(s==a[i].lable||s==a[i].id) return true; }}return false;
}int main()
{int n,m;string s;cin>>n>>m;cin.ignore();for(int i=1;i<=n;i++){getline(cin,s);a[i].cnt = 0;a[i].id = "";a[i].lable = "";for(int j=0;j<s.length();j++){if(s[j] == '.') a[i].cnt++;else if(s[j] == ' ')a[i].lable = toLower(s.substr(a[i].cnt,j-a[i].cnt));else if(j+1 == s.length())a[i].lable = toLower(s.substr(a[i].cnt,j-a[i].cnt+1));else if(s[j] == '#'){a[i].id = s.substr(j);break;} }}for(int i=0;i<m;i++){ans.clear();query.clear();char tmp[100];scanf("%[^\n]",tmp);getchar();char *sp=strtok(tmp," ");//将插叙用空格分割,按序存放在query向量中 while(sp){//注意标签大小写是敏感的 query.push_back(toLower(sp));//添加 并 变小写 sp=strtok(NULL," ");}int len=query.size();for(int j=1;j<=n;j++)//遍历dom {if(query[len-1]==a[j].id||query[len-1]==a[j].lable)//可能存在 {int start=j,cnt=a[j].cnt,k=len-2;//匹配路径 for(;k>=0;k--){if(!search(a,start,cnt,query[k])) break;//这里不更新 ant的原因是search函数用的引用cnt在内部更新 }if(k<0)//成功ans.push_back(j); }}//输出结果 cout<<ans.size();for(int j=0;j<ans.size();j++)cout<<" "<<ans[j];cout<<endl;}return 0;
}
这篇关于csp月模拟 201809-3 元素选择器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!