第四道月模csp201809-3 元素选择器

2023-05-16

题目背景

在这里插入图片描述在这里插入图片描述

题目描述

在这里插入图片描述在这里插入图片描述

输入输出

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(t[i]>'A'-1&&t[i]<'Z'+1){
			t[i]=tolower(t[i]);
		}
	}
} 

void split(string &t,int x){
	int suo=0,flag=0;
	int s1=0,s2=0;
	for(int i=0;i<t.size();i++){
		if(t[i]=='.'){suo++;	}
		if(t[i]!='.'&&flag==0){   //记录遇到的第一个非'.'位置 
			flag=1;	 
			s1=i;
		}
		if(t[i]==' '&&flag==1){   //若有属性,记录属性出现位置
			s2=i+1;	
			flag=2;	
			break; 
		}
	}
	string tmp,tmp_id;
	if(flag!=2){   
	//没有属性,只有标签和缩进 
		tmp=t.substr(s1);
		toLower(tmp);   //改为小写
		e[x].label=tmp;
		e[x].level=suo/2; 
	}
	else{   //有属性 
		tmp=t.substr(s1,s2-s1-1);
		toLower(tmp);   //改为小写
		tmp_id=t.substr(s2);
		e[x].label=tmp;
		e[x].id=tmp_id;
		e[x].level=suo/2; 
	}
} 

bool match(int x){  //判断元素是否与选择器匹配 
	int t=e[x].level,qq=q.size()-2;
	for(int i=x-1;i>=0;i--){
		if(e[i].level==t-1){
			if(q[qq][0]!='#'&&q[qq]==e[i].label){qq--;}
            else if(q[qq][0]=='#'&&q[qq]==e[i].id){qq--;}
            t=e[i].level;
            if(qq<0)return true;
		}
	}
	return false;
}

int main(){
	cin>>n>>m;
	string tmp;
	getchar();   
	for(int i=0;i<n;i++)
	{   //读入结构化文档 
		getline(cin,tmp);
		split(tmp,i);
	} 
	
	for(int i=0;i<m;i++)
	{   //读入选择器 
		getline(cin,tmp);
		stringstream st;
		st<<tmp;
		string tt;
		while(st>>tt){
			if(tt[0]!='#'){toLower(tt);	}   //不是id选择器,大小写不敏感 
			q.push_back(tt);
		}
		int qs=q.size();
		for(int j=0;j<n;j++){
			if(q[qs-1][0]=='#'&&q[qs-1]==e[j].id
			||q[qs-1][0]!='#'&&q[qs-1]==e[j].label){
				if(q.size()==1||match(j)){
					ans.push_back(j+1);
				}
			}
		}
		cout<<ans.size();
		for(int i=0;i<ans.size();i++){
			cout<<" "<<ans[i];
		}
		cout<<"\n";
		ans.clear();
		q.clear();
	}
	return 0;
} 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第四道月模csp201809-3 元素选择器 的相关文章

随机推荐

  • debian8 jessie 更换为国内源

    编辑 etc apt sources list文件 xff1a 用 注释掉老的源 添加新的源 xff0c deb http mirrors 163 com debian jessie main non free contrib deb ht
  • 09、Flutter FFI Dart Native API

    Flutter FFI 学习笔记系列 Flutter FFI 最简示例 Flutter FFI 基础数据类型 Flutter FFI 函数 Flutter FFI 字符串 Flutter FFI 结构体 Flutter FFI 类 Flut
  • Copilot 自动编程AI工具

    OpenAI与GitHub联合构建的AI自动编程工具Copilot xff0c Copilot基于自然语言处理模型GPT 3搭建而成 xff0c Copilot预览版已经正式上线Visual Studio Code平台 OpenAI的GPT
  • SQLite的SQL语法

    SQLite库可以解析大部分标准SQL语言 但它也省去了一些特性 并且加入了一些自己的新特性 这篇文档就是试图描述那些SQLite支持 不支持的SQL语法的 查看关键字列表 如下语法表格中 xff0c 纯文本用蓝色粗体显示 非终极符号为斜体
  • 动态链接库dll(Windows/C++)

    1 概念 xff08 1 xff09 动态链接库广泛用于Windows系统及应用程序 xff0c 不能单独被执行 xff0c 在应用程序运行期间被动态调用的模块文件 区别于静态链接库 xff0c 均属于独立的代码编译模块 xff0c 但静态
  • 【Java】反射时获取父类属性并赋值

    1 反射获取父类 在反射获取类里的所有属性的时候 xff0c 会遇到无法访问父类extends里面的值 这时候需要访问父类需要调用Class的方法getSuperclass 对父类进行遍历field 同时如果不想遍历到Object或者某个类
  • linux软件包安装命令——apt-get

    apt get是linux中APT软件包的管理工具 采用shell命令行的方式完成软件的安装 更新 卸载等操作 1 语法 apt get xff08 选项 xff09 xff08 参数 xff09 选项 xff1a c 指定配置文件 o 直
  • 浅谈路由器的wan、lan、wlan口和vlan/trunk口

    背景 另一篇博文分析了一个实际的路由问题 xff0c 为方便问题分析 xff0c 在此列出常用概念 vlan中的trunk口 VLAN Trunk以及三层交换 可以把switch某一端口设为trunk 端口 问题 IP地址分类 xff1a
  • bzoj4864 [BeiJing 2017 Wc]神秘物质

    http www elijahqi win 2018 01 26 bzoj4864 beijing 2017 wc E7 A5 9E E7 A7 98 E7 89 A9 E8 B4 A8 20 E2 80 8E Description 21
  • mysql8设置远程连接详细教程

    这是转载StackOverFlow上的回答 xff0c 原回答点此这里 Remote Access in MySQL 8 Allow access from any host sudo nano etc mysql mysql conf d
  • 倒水问题(bfs)

    题意概述 34 fill A 34 表示倒满A杯 xff0c 34 empty A 34 表示倒空A杯 xff0c 34 pour A B 34 表示把A的水倒到B杯并且把B杯倒满或A倒空 Input 输入包含多组数据 每组数据输入 A B
  • A-化学

    题目概述 假设如上图 xff0c 这个烷烃基有6个原子和5个化学键 xff0c 6个原子分别标号1 6 xff0c 然后用一对数字 a b 表示原子a和原子b间有一个化学键 这样通过5行a b可以描述一个烷烃基 你的任务是甄别烷烃基的类别
  • B-评测系统

    题目概述 例如某次考试一共八道题 xff08 A B C D E F G H xff09 xff0c 每个人做的题都在对应的题号下有个数量标记 xff0c 负数表示该学生在该题上有过的错误提交次数但到现在还没有AC xff0c 正数表示AC
  • week4_C TT的神秘礼物

    题目描述 TT 是一位重度爱猫人士 xff0c 每日沉溺于 B 站上的猫咪频道 有一天 xff0c TT 的好友 ZJM 决定交给 TT 一个难题 xff0c 如果 TT 能够解决这个难题 xff0c ZJM 就会买一只可爱猫咪送给 TT
  • week8_C 班长竞选(Kosaraju算法 SCC缩点)

    题目描述 大学班级选班长 xff0c N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适 xff0c 意见具有传递性 xff0c 即 A 认为 B 合适 xff0c B 认为 C 合适 xff0c 则 A 也认为 C 合
  • week15实验 D_瑞瑞爱上字符串/F_东东:“来不及解释了,快上车!!”

    D 瑞瑞爱上字符串 题目 瑞瑞最近迷上了字符串 xff0c 因此决定出一个字符串的题 给定两个正整数 N K xff0c 考虑所有由 N 2 个 a 和 2 个 b 组成的字符串 xff0c 要求输出其中字典序第 K 小的 例如当 N 61
  • CSP-M4补题 A_TT数鸭子

    题目 这一天 xff0c TT因为疫情在家憋得难受 xff0c 在云吸猫一小时后 xff0c TT决定去附近自家的山头游玩 TT来到一个小湖边 xff0c 看到了许多在湖边嬉戏的鸭子 xff0c TT顿生羡慕 此时他发现每一只鸭子都不 一样
  • 第二道月模csp201604-3 路径解析

    题目 在操作系统中 xff0c 数据通常以文件的形式存储在文件系统中 文件系统一般采用层次化的组织形式 xff0c 由目录 xff08 或者文件夹 xff09 和文件构成 xff0c 形成一棵树的形状 文件有内容 xff0c 用于存储数据
  • 第三道月模csp201609-3炉石传说

    题目 炉石传说 xff1a 魔兽英雄传 xff08 Hearthstone Heroes of Warcraft xff0c 简称炉石传说 xff09 是暴雪娱乐开发的一款集换式卡牌游戏 xff08 如下图所示 xff09 游戏在一个战斗棋
  • 第四道月模csp201809-3 元素选择器

    题目背景 题目描述 输入输出 Input Output Sample Input Sample Output 数据规模和约定 思路分析 根据题意 xff0c 创建element结构体 xff0c 新建element类型数组e xff0c 用