csp 201809-3 元素选择器

2023-05-16

题意:

在这里插入图片描述

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


思路:

这道题的解决应该分为建树 + 查找两部分。
关于建树,为了方便后代选择器的查找,采用儿子记录父节点的方法,即每个节点记录自己的父节点位置。采用数组描述这棵树,每行的信息都在数组对应的位置上,关于每行信息,采用结构体描述

struct Element
{
	string label;
	string id;
	int father;  //代表父节点位置
	int ceng;    //小数点的个数除2

}

label是标签信息,id如果没有就是“”,father是他父节点在数组中的位置,ceng就是他的层次。在将n个信息输入进来的时候,通过“.”的个数可以得知在哪一层,根据他的信息可以获得label和id,关于父节点的设置我们可以采用一个单调栈结构来得出,维护这个单调栈从栈顶到栈底层次递减,那么将我们有新的一行信息输入时,我们得到了这一行的层次,接着我们看栈,首先弹出所有层次不比他小的,然后这一行的父节点就是栈顶元素,即最靠近他的比他层次靠前的,若是全弹出去了,那这一行的父节点就是-1。

关于查找,首先判断是三种选择器的哪一个,对于标签和id,直接遍历数组,看有没有合适的即可,对于后代选择器,采用逆序判断的方法,即从后代选择器中的最后一个向前判断,需要设立一个函数,我们依旧是遍历所有的元素,都首先判断遍历到的这个位置满不满足后代选择器中的最后一个,如果不满足就跳过,如果满足就查看这个位置的父节点满不满足后代选择器的倒数第二个,如果不满足就看这个新的位置的父节点满不满足倒数第二个,因为这道题是只有有祖先满足即可,所以没有必要所有的都连着,上一级选择器可能无法满足父亲但是可以满足祖先,那么也算可以匹配!!!

代码部分注意点:
判断字符串中有没有某个元素可以采用find函数。如果有会返回位置,没有的话

(st[i].find("#") == string::npos

可以用string的substr函数将字符串的某部分复制出来

将字符串按照空格划分成新的字符串可以将字符串化为流,然后输入

istringstream s(str);
string st[105];
int tot = 0;
while (s >> st[tot])
{
	tot++;
}

代码:

#include<iostream>
#include<map>
#include<string>
#include<stack>
#include<sstream>
using namespace std;

//标签大小写不敏感
bool labelEqual(string& x, string& y)
{
	if (x.size() != y.size())return false;

	int len = x.size();

	for (int i = 0; i < len; i++)
	{
		if(!(x[i] == y[i] || x[i] == (y[i] + 'A' - 'a') || x[i] == (y[i] + 'a' - 'A')))return false;
	}
	return true;
}


struct Element
{
	string label;
	string id;
	int father;  //代表父节点位置
	int ceng;    //小数点的个数除2

}element[105];

bool decSuccess(string st[], int cnt, int now)
{
	int temp = now;
	for (int i = cnt - 1; i >= 0; i--)
	{
		if (st[i].find("#") == string::npos)//没有"#",标签选择器
		{
			if (!labelEqual(st[i], element[now].label))
			{
				if (now == temp)return false;
				else i++;
			}
		}
		else
		{
			string id = st[i].substr(1);
			if (id != element[now].id)
			{
				if (now == temp)return false;
				else i++;
			}
		}
		if (i == 0)return true;
		if (element[now].father == -1)return false;
		else now = element[now].father;
	}
}

int main()
{
	int n, m;
	cin >> n >> m;
	stack<int>sta;  //用来辅助求取父节点
	getchar();
	for (int i = 0; i < n; i++)
	{
		string str;
		getline(cin, str);
		int k = 0;
		for (k; k < str.size(); k++)
		{
			if (str[k] != '.')break;
		}
		//k的值为小数点的个数
		element[i].ceng = k / 2;
		while (!sta.empty() && element[sta.top()].ceng >= k / 2)
			sta.pop();
		if (sta.empty())element[i].father = -1;
		else element[i].father = sta.top();

		sta.push(i);

		if (str.find("#") == string::npos)//代表没有id
		{
			element[i].label = str.substr(k);
			element[i].id = "";
		}
		else
		{
			element[i].id = str.substr(str.find("#") + 1);
			element[i].label = str.substr(k, str.find("#") - k - 1);
		}
	}

	for (int i = 0; i < m; i++)
	{
		string str;
		getline(cin, str);

		int num = 0;  //满足的行的个数
		int ans[105];  //分别是哪些行

		//标签选择器
		if (str.find("#") == string::npos && str.find(" ") == string::npos)  //没有空格和“#”
		{
			for (int k = 0; k < n; k++)
			{
				if (labelEqual(str, element[k].label))
				{
					ans[num] = k + 1;
					num++;
				}
			}
		}
		else 
		{
			//id选择器
			if (str.find(" ") == string::npos)
			{
				string id = str.substr(1);
				for (int k = 0; k < n; k++)
				{
					if (element[k].id == id)
					{
						ans[num] = k + 1;
						num++;
					}
				}
			}
			else //后代选择器
			{
				istringstream s(str);
				string st[105];
				int tot = 0;
				while (s >> st[tot])
				{
					tot++;
				}
                
				for (int k = 0; k < n; k++)
				{
					if (decSuccess(st, tot, k))
					{
						ans[num] = k + 1;
						num++;
					}
				}

			}
		}
		cout << num << " ";
		for (int k = 0; k < num; k++)
			cout << ans[k] << " ";
		cout << endl;
	}
}

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

csp 201809-3 元素选择器 的相关文章

  • 清除SSH秘钥的命令

    重新安装了openmediavault之后在连接就是这样 xff0c 具体的原因是因为主机保存了以前的秘钥 PS C Users qs gt ssh root 64 10 11 12 2 64 64 64 64 64 64 64 64 64
  • HR-XML(可扩展人力资源标准)简介

    HR XML xff08 可扩展人力资源标准 xff09 简介 Flyspace flyspace 64 x263 net 2003 年 12 月 12 日 标准出处 xff1a http www hr xml org 标准简介 xff1a
  • 解决System进程占用80端口的问题

    1 IIS占用80端口 用如下方法可以解决System进程占用80端口的问题 xff1a 打开RegEdit 找到HKEY LOCAL MACHINE SYSTEM CurrentControlSet Services HTTP 找到一个D
  • Win 7, Server 2008 R2最大线程数限制

    最近在做压力测试时发现Win 7 和 Server 2008 R2 系统内线程数设为1500则无法创建线程池 xff0c 深入分析发现32位和64位程序存在很大性能差异 最大线程数 xff1a 32bit xff1a 1450 64bit
  • 算法|找出数组的最大公约数

    力扣第255场周赛题目 刷题链接 https leetcode cn com problems find greatest common divisor of array 题目描述 给你一个整数数组 nums xff0c 返回数组中最大数和
  • 结构体对齐规则

    结构体对齐规则 xff1a 1 第一个成员在于结构体变量偏移量为0的地址处 2 其他成员变量要对齐到某个数字 xff08 对齐数 xff09 的整数倍的地址处 对齐数 61 编译器默认的一个对齐数 与 该成员大小的 较小值 3 结构体总大小
  • Snapper转换器的捕捉类型

    原文发布时间 xff1a 2014 09 24 作者 xff1a Tenniwdy 在数据处理中Snapper转换器的作用是很强大的 xff0c 它的各类捕捉类型能针对不同的需求对数据进行处理 在FME Desktop 2014版本中新增了
  • STM32 4x4矩阵键盘初始化及实现多位输入

    目的 xff1a 实现矩阵键盘的多位数据输入 这里以两位数据为例 引脚初始化PC0 PC7 void Key Config GPIO InitTypeDef GPIO InitStructure RCC APB2PeriphClockCmd
  • CSP 202206 题解:归一化处理,寻宝大冒险,角色授权,光线追踪,PS无限版

    试题内容请前往CCF官网查看 xff1a CCF CSP计算机软件能力认证考试 http 118 190 20 162 home page 阅读本题解前 xff0c 您应当了解下列知识 xff1a 线段树 教程C 43 43 标准库 xff
  • 在 VirtualBox 中构建 Debian11 虚拟电脑

    文章目录 前言一 准备工作和Debian简介二 新建虚拟电脑三 安装 Debian11四 Debian11系统环境配置配置光盘软件镜像源配置国内镜像软件源控制台鼠标支持 安装虚拟机增强功能SSH 接入国际化和本地化配置网卡 结语 前言 介绍
  • 【华为机试真题 Python】 放苹果

    目录 题目描述 输入 输出 示例 参考代码 题目描述 把m个同样的苹果放在n个同样的盘子里 允许有的盘子空着不放 问共有多少种不同的分法 注意 如果有7个苹果和3个盘子 5 1 1 和 1 5 1 被视为是同一种分法 数据范围 0 m 10
  • keil5 显示 No target connected

    keil5 显示 No target connected 第一 xff0c 确认上电是否正常 xff0c 板子上有电源指示灯 xff1b 就是那个红色的指示灯 第二 xff1a 长按核心板上的复位键不要松开 找到Debug xff0c 确认
  • Debian系统安装中文包

    相对于Ubuntu系统 xff0c debian系统性对来说较为原始 xff0c 不能像Ubuntu一样一键设定为中文 xff0c 这样就必须自行设定 xff1a 1 安装aptitude xff1a sudo apt span class
  • 解决Linux(Ubuntu)系统下复制粘贴文件权限不够的问题

    首先是ctrl 43 alt 43 t 打开一个终端 运行命令 sudo nautilus 就可以打开一个具有管理员权限的文件管理器 xff0c 然后就可以在不切换到管理员的条件下拷贝文件
  • 解决开机出现“CLIENT MAC ADDR”的问题

    开机自检后 xff0c 系统会出现网卡配置的提示 xff0c 此时按Shift 43 F10组合键可进入配置页面 xff0c 如果不按该组合键 xff0c 几秒后则跳入下一页面 xff0c 这里会停留一段时间 xff0c 一般是一二十秒的样
  • iOS之性能优化·提高App的编译速度

    一 前言 经过多年的开发和迭代 xff0c 我相信很多的 iOS 项目代码已经达到几十万行甚至上百万行的规模 xff0c 所使用的 Pod 库的数量可以达到几十个甚至上百个 xff0c App Store 安装包也变得越来越大 xff0c
  • iOS之性能优化·优化App界面的渲染与流畅度

    一 界面渲染流程 渲染流程分析 计算机中的显示过程通常是通过 CPU GPU 显示器协同工作来将图片显示到屏幕上 xff0c 如下图所示 xff1a 苹果为了解决图片撕裂的问题使用了 VSync 43 双缓冲区的形式 xff0c 就是显示器
  • 图像处理:傅里叶变换

    0 引言 在之前的博客 图像增强 xff0c 傅里叶变换 xff08 OpenCV 中都有用到过傅里叶变换 xff0c 但一直都不是特别理解 xff0c 现系统地学习一下 先来看一个视频 傅里叶级数与傅立叶变换 xff0c 我们了解到任何周
  • 从键盘输入10个整数,判断并输出10个数中的最大值和平均值

    include lt graphics h gt include lt conio h gt include lt stdio h gt int main int a 61 0 b 61 0 c 61 0 i 61 1 n max 61 0
  • ubuntu虚拟机忘记开机密码,重置密码

    有时我们会忘记ubuntu虚拟机的开机密码 xff0c 这是候需要我们重置密码 xff0c 步骤如下 xff1a 1 打开虚拟机 xff0c 在虚拟机启动界面出现时 xff0c 鼠标点击虚拟机启动界面 xff0c 将键盘输入定向到虚拟机 x

随机推荐

  • 结构体数组操作+文件读写

    一 1 声明了该结构体就声明了结构体内所有成员 include lt stdio h gt typedef struct stuInfo char name int age int num Student int main int argc
  • CEF中JavaScript与C++交互

    在CEF里 xff0c JS和Native xff08 C C 43 43 xff09 代码可以很方便的交互 xff0c 这里https bitbucket org chromiumembedded cef wiki JavaScriptI
  • 阿里云网盘内测网址

    阿里云Teambition网盘内测申请地址 这个网盘还没有开放 xff0c 想要体验的话可以申请 xff0c 通过后 xff0c 获得体验资格 网址 xff1a https form teambition net f CjQetM x fi
  • Python 创建安装包

    Version usr bin env python3 coding utf 8 64 Author forward huan 64 Time 2022 07 14 23 05 64 Description import json impo
  • IOS UITableViewCell高度自适应的那些事

    好啦 xff0c 这是一个老生常谈的问题 真的 xff0c 有时候把人气得想去搞安卓 xff0c 安卓就没得这码子事 xff5e 方案有很多 xff0c 我这里提供三种方案 其实每种自适应高度的方法都有比较适合自己的情景 xff0c 比如c
  • Sublime Text 最新注册码

    Sublime Text 最新注册码 Sublime 更新后 xff0c 很多验证码都失效了 收集了一些在 2017 09 14 测试有效的注册码 xff0c 适用于 xff1a Sublime Text 2 3 xff0c Build 2
  • 群晖NAS变成TimeMachine时间机器完成Mac备份

    如果有一台群晖Nas xff0c 那么我们可以很方便的利用他完成Mac系统的自动备份 我的群晖在路由器后面 xff0c 所以当我不再家的时候备份 xff0c 则需要使用vpn连接到群晖 接下来让我们实践出真知吧 1 在群晖nas中设置一个同
  • 如何生成ssh key,以及repo init 遇到的无法检查签名:找不到公钥 问题

    repo init 遇到 无法检查签名 找不到公钥 的问题 源文章 xff1a http blog csdn net njuitjf article details 38386941 方法一 xff1a 出现此问题是repo版本不对的问题
  • 选数问题 Gym - 270437C

    题意 xff1a 给定n个正整数 xff0c 从中选取K个数 xff0c 保证这K个数的和是S 求有多少种选择的方法 Input 第一行输入一个整数T T lt 61 100 xff0c 表示有T个测试样例 对于每个例子 xff0c 有两行
  • 掌握魔法的东东II Gym - 101510B

    题意 xff1a 从瑞神家打牌回来后 xff0c 东东痛定思痛 xff0c 决定苦练牌技 xff0c 终成赌神 xff01 东东有 A B 张扑克牌 每张扑克牌有一个大小 整数 xff0c 记为a xff0c 范围区间是 0 到 A 1 x
  • 传递闭包 Floyd算法

    题意 xff1a 众所周知 xff0c TT 有一只魔法猫 这一天 xff0c TT 正在专心致志地玩 猫和老鼠 游戏 xff0c 然而比赛还没开始 xff0c 聪明的魔法猫便告诉了 TT 比赛的最终结果 TT 非常诧异 xff0c 不仅诧
  • csp m2 咕咕东的奇妙序列 二分

    题意 xff1a 题目描述 咕咕东 正在上可怕的复变函数 xff0c 但对于稳拿A Plus的 咕咕东 来说 xff0c 她早已不再听课 xff0c 此时她在睡梦中 突然想到了一个奇怪的无限序列 xff1a 112123123412345
  • A - 咕咕东的目录管理器

    题意 xff1a 样例输入 xff1a span class token number 1 span span class token number 22 span MKDIR dira CD dirb CD dira MKDIR a MK
  • ssh密钥对

    SSH密钥 1 生成ssh密钥对 不要私钥密码 连续回车 win git ssh keygen t rsa b 4096 C 34 yourname or youremail 34 34 qs 64 Dell MINGW64 span cl
  • C - 公园坐椅子

    题意 xff1a SDUQD 旁边的滨海公园有 x 条长凳 第 i 个长凳上坐着 a i 个人 这时候又有 y 个人将来到公园 xff0c 他们将选择坐在某些公园中的长凳上 xff0c 那么当这 y 个人坐下后 xff0c 记k 61 所有
  • week12 hw 必做题1,2

    题意 xff1a 给出n个数 xff0c zjm想找出出现至少 n 43 1 2次的数 xff0c 现在需要你帮忙找出这个数是多少 xff1f Input 本题包含多组数据 xff1a 每组数据包含两行 第一行一个数字N 1 lt 61 N
  • week13 hw必做1,2

    题意 xff1a 这一天 xff0c TT 遇到了一个神秘人 神秘人给了两个数字 xff0c 分别表示 n 和 k xff0c 并要求 TT 给出 k 个奇偶性相同的正整数 xff0c 使得其和等于 n 例如 n 61 10 xff0c k
  • week14限时模拟 猫睡觉问题 HDU - 3700

    题意 xff1a 众所周知 xff0c TT家里有一只魔法喵 这只喵十分嗜睡 一睡就没有白天黑夜 喵喵一天可以睡多次 xff01 xff01 每次想睡多久就睡多久 喵睡觉的时段是连续的 xff0c 即一旦喵喵开始睡觉了 xff0c 就不能被
  • CSP M4 C 宇宙狗的危机

    题意 xff1a 描述 在瑞神大战宇宙射线中我们了解到了宇宙狗的厉害之处 xff0c 虽然宇宙狗凶神恶煞 xff0c 但是宇宙狗有一个很可爱的女朋友 最近 xff0c 他的女朋友得到了一些数 xff0c 同时 xff0c 她还很喜欢树 xf
  • csp 201809-3 元素选择器

    题意 xff1a 思路 xff1a 这道题的解决应该分为建树 43 查找两部分 关于建树 xff0c 为了方便后代选择器的查找 xff0c 采用儿子记录父节点的方法 xff0c 即每个节点记录自己的父节点位置 采用数组描述这棵树 xff0c