【CCF 2018-9-3 元素选择器】题目链接:元素选择器
题目描述:
文章图片
文章图片
文章图片
文章图片
思路:
模拟题,简化版的元素选择器,首先创建储存每一层的节点,节点中包括标签,id属性和缩进。由于对于标签的大小写不敏感,因此统一将标签设置为小写,用到了库函数tolower进行转换。设置search函数用来查找在数组中缩进小于level且标签或属性等于s的元素,如果有就返回true,否则返回false。
主函数中用p1,p2分别记录标签和属性的位置,level记录缩进,然后统一标签为小写。然后对m个选择器进行查询,用两个vector数组分别记录查询过程和结果。
总结:
模拟题的东西就是涉及到很多思路和很多知识点,需要全方位思考才能得出结果。同时不能产生畏惧心理,不然就直接劝退了。
代码:
#include
#include
#include
using namespace std;
const int maxn=110;
struct node{
string lable,id;
int level;
};
node k[maxn];
int n,m,p1,p2,level,length;
string str;
void change(string &s){
for(int i=0;
i.length();
i++)
s[i]=tolower(s[i]);
}
bool search(node k[],int &start,int &level,string s){
for(int i=start;
i>=1;
i--)
if(k[i].level>n>>m;
getchar();
for(int i=1;
i<=n;
i++){
getline(cin,str);
p1=-1,p2=-1,level=0;
for(int j=0;
j.length();
j++)
if(str[j]=='.')
level++;
else if(p1==-1&&str[j]!='#')
p1=j;
else if(str[j]=='#')
p2=j;
k[i].level=level;
if(p2==-1){
k[i].lable=str.substr(p1);
k[i].id="";
}
else{
k[i].lable=str.substr(p1,p2-p1-1);
k[i].id=str.substr(p2);
}
change(k[i].lable);
}
for(int i=0;
isvec;
vectorivec;
gets(ch);
char *op=strtok(ch," ");
while(op){
svec.push_back(op);
op=strtok(NULL," ");
}
length=svec.size();
for(int j=0;
j=0;
l--)
if(!search(k,pp,level,svec[l]))
break;
if(l<0)
ivec.push_back(j);
}
cout<
推荐阅读
- 笔记|如何在Windows11安装安卓子系统()
- 笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
- 2021年下半年《信息系统项目管理师》真题
- 个人理解|【C语言基础之类型转换】
- 学习分享|【C语言函数基础】
- 个人理解|【C语言实现井字棋及电脑落子优化】
- Python|蓝桥杯 平面切割 Python
- Python|Python 每日一练 二分查找 搜索旋转排序数组 详解
- 笔记|这是一个关于face_recognition和dlib库的安装(亲测有用,毕竟我代码都写出来了)
- 信令模式与非信令模式