程序设计与实践 模拟题四 201809-3 元素选择器

2023-05-16

201809-3 元素选择器

题目描述


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

题解

本题是一道思维难度不大的模拟题。实现过程和思想都比较简单,具体实现比较难,认真仔细即可。(但是自己一开始写的代码只得了80分,又比较了其他人的代码才完全过)。
由数据规模和约定可以看出数据量不大,不须着重考虑时间复杂度和空间复杂度的问题。
每一个元素用一个结构体node来存储:string类型的来存放标签和id。int型level来存放元素的层级,即包含关系(这个变量主要用于查找元素的父辈元素)。node指针指向该元素的父亲元素。

struct node{
	string tag,id;
	int level;
	node* par;
	node(string t,string i,int l):tag(t),id(i),level(l),par(NULL) {}
}; 

比较复杂的地方 后代选择器的输入用到了以下函数:

void divide(const string& line,vector<string>& s)
{
	s.clear();
	string tmp;
	for(int i=0;i<line.size();i++)
	{
		if(line[i]==' ')
		{
			s.push_back(tmp);
			tmp.clear();
		}
		else tmp+=line[i];
	}
	s.push_back(tmp);
}

函数的参数line存放后代选择器的一整行,将后代选择器的每一个元素都分开并按顺序存放进参数s中。用tmp存放当前的元素,循环遍历line,若line[i]为空格说明上一个元素结束,把tmp放进s中,并清空tmp方便下一个元素放入。并在最后将最后一个元素放进s中。
如何在输入时确定元素的包含关系:用一个栈来存放已经输入的各个层级的元素。输入一个元素,若栈不为空,则从栈顶开始遍历,遍历到的第一个level小于输入元素的level的元素,就是输入元素的父亲元素(level相同的是同一个父亲的兄弟元素,level更大的是兄弟元素的子元素,在遍历的过程中要将这些删掉,因为后面也用不到了)。最后,再下一个元素输入之前要将本元素放入栈中。
类似于一个树的结构,只要每个元素都记录下父亲元素,就可以从任意一个元素寻找到根。
真正存放所有元素的是存放node*的vector型元素nodes,每个元素输入完成后都要存入nodes中。
查找时,把标签选择器和id选择器都看作只有一个元素的后代选择器,不再区分选择器类型。用函数把后代选择器里的元素依次放到vector s里。遍历每一个nodes中的元素t,sl=s.size()-1,若与s[sl]相匹配,则t指向父亲元素,sl–,依次比较下去,完全相同则说明匹配,匹配则将序号放在vector ans里。最后,输出ans.size()和ans的各个元素。

代码

#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <sstream>

using namespace std;

struct node{
	string tag,id;
	int level;
	node* par;
	node(string t,string i,int l):tag(t),id(i),level(l),par(NULL) {}
}; 

void divide(const string& line,vector<string>& s)
{
	s.clear();
	string tmp;
	for(int i=0;i<line.size();i++)
	{
		if(line[i]==' ')
		{
			s.push_back(tmp);
			tmp.clear();
		}
		else tmp+=line[i];
	}
	s.push_back(tmp);
}

bool compar(node* t,const string& s)
{
	if(s[0]=='#') return s==t->id;
	if(s.size()!=t->tag.size()) return false;
	for(int i=0;i<s.size();i++)
	{
		if(tolower(s[i])!=tolower(t->tag[i])) return false;
	}
	return true;
}

int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	
	vector<node*> nodes;
	//nodes.clear();
	stack<node*> parents;
	//while(!parents.empty()) parents.pop();
	
	string line;
	getline(cin,line);
	while(n--)
	{
		getline(cin,line);
		int level=0;
		while(line[level]=='.') level++;
		stringstream ss(line.substr(level));
		string tag,id;
		ss>>tag>>id;
		node* now=new node(tag,id,level);
		if(!parents.empty())
		{
			node* p;
			while(p=parents.top(),p->level>=level)
			{
				parents.pop();
			}
			now->par=p;
			
		}
		parents.push(now);
		nodes.push_back(now);
	} 
	
	vector<int> ans;
	vector<string> sel;
	while(m--)
	{
		getline(cin,line);
		divide(line,sel);
		ans.clear();
		for(int i=0;i<nodes.size();i++)
		{
			int sl=sel.size()-1;
			if(compar(nodes[i],sel[sl]))
			{
				node* t=nodes[i]->par;
				sl--;
				while(t&&sl>=0)
				{
					if(compar(t,sel[sl])) sl--;
					t=t->par;
				}
				if(sl==-1) ans.push_back(i+1);
			}
		}
		
		printf("%d ",ans.size());
		for(int i=0;i<ans.size();i++) printf("%d ",ans[i]);
		if(m!=0) printf("\n");
	}
	return 0;
}
/*11 5
html
..head
....title
..body
....h1
....p #subtitle
....div #main
......h2
......p #one
......div
........p #two
p
#subtitle
h3
div p
div div p

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

程序设计与实践 模拟题四 201809-3 元素选择器 的相关文章

  • 无线攻击 --Wifite(批量破解无线工具)

    文章目录 一 用法概述二 命令格式三 用法示例3 1 破解某个AP 一 用法概述 Wifite使用命令行界面连续攻击多个WPA WPS加密的网络 xff0c 不需要记住参数即可使用它 xff1a 按信号强度排序 xff08 db单位 xff
  • 图像轮廓提取算法(Opencv基于C++实现)

    Opencv图像轮廓提取 0 实现结果如下 xff1a 1 打开图像代码2 轮廓提取函数3 代码实现 本文主要实现了图像的轮廓提取 xff0c 首先先给出直观的轮廓实现结果 xff1a 0 实现结果如下 xff1a 1 打开图像代码 注意图
  • c++实现2048小游戏

    C 43 43 实现2048 2048小游戏界面展示效果图 xff1a span class token macro property span class token directive hash span span class toke
  • OpenGL深度测试

    OpenGL深度测试 1 深度缓冲 Depth Buffer 2 深度缓冲实现3 深度测试函数测试对比4 深度冲突 Z fighting 1 深度缓冲 Depth Buffer 深度缓冲是由窗口系统自动创建的 xff0c 它会以16 24或
  • OpenGL渲染STL三角网格模型

    Opengl绘制STL模型 实现效果STL模型文件实现代码 实现效果 首先先看看使用可编程管线实现的STL模型的渲染效果 xff0c 网格模型的数量大约在100来万 xff0c 实现的效果还是挺鲁棒 STL模型文件 关于STL的文件格式主要
  • Opengl同时显示模型和三角网格线框

    Opengl同时显示模型和三角网格线框 glPolygonMode 函数及相关参数同时显示模型和三角网格线框 glPolygonMode 函数及相关参数 glPolygonMode 参数1 参数2 参数1 可以为 xff1a GL FRON
  • Shader Language编程语言(CG/HLSL/GLSL)

    Shader Language编程语言 Shader Language编程语言 Shader Language编程语言 Shader Language目前主要有3种主流语言 xff1a 基于 OpenGL 的 OpenGL Shading
  • D3D12编译遇到的问题

    D3D12编译遇到的问题 X3501 39 main 39 entrypoint not foundLNK2019 无法解析的外部符号 main xff0c 函数 34 int cdecl invoke main void 34 invok
  • VS2019CPU/内存诊断功能

    VS2019诊断功能 vs代码内存 CPU使用率诊断内存泄漏诊断 vs代码内存 CPU使用率诊断 在代码运行过程中 xff0c 有时候会出现内存泄漏 xff0c 内存 CPU占用过高等情况 xff0c 这些情况的出现十分影响代码的运行效率和
  • C++和Python Java的区别

    C 43 43 和Python Java的区别 C 43 43 执行效率高 xff0c 编程难 开发效率低 Python执行效率低 xff0c 编程简单 开发效率快 C 43 43 为编译性编程语言 xff0c Python 则为解释性编程
  • 实时渲染和离线渲染

    实时渲染和离线渲染 1 实时渲染2 离线渲染3 对比 1 实时渲染 实时渲染指的是一边计算画面 xff0c 一边输出显示 特点是 xff1a 能实时操控 实时交互 xff0c 并且以极高的速度将3D图像处理了 xff0c 同时实现了逼真的效
  • Linux中crontab的坑爹环境变量问题

    手动在CentOS中执行sh脚本 xff0c 调用java程序 xff0c 一切正常 xff1b 将该sh加入crontab中定时调度之后 xff0c 挂了 xff0c 完全没有执行到的感觉啊 xff01 xff01 xff01 查看cro
  • Win32窗口

    Win32窗口 span class token comment windows 开发所需头文件 包含Windows开发所需要的宏 类 函数 结构体等结构的定义 span span class token macro property sp
  • MFC按钮禁用实现

    MFC按钮禁用 m Bn xxx span class token punctuation span span class token function EnableWindow span span class token punctuat
  • MFC屏幕截图

    屏幕截图 实现屏幕截图 xff0c 并保存多张图片 截图的效果 span class token keyword void span span class token class name CMFCApplication1Dlg span
  • obj模型文件的格式

    obj模型的格式 带纹理的obj模型mtl材质文件推荐参考库文件tiny obj loaderassimp 带纹理的obj模型 一般带纹理的obj模型需要有以下三个文件 xff0c 分别是 obj文件 xff0c mtl纹理库文件 xff0
  • n维顶点模板类

    span class token keyword template span span class token operator lt span span class token keyword int span nD span class
  • MFC鼠标移入移出操作

    MFC鼠标移入移出 span class token keyword void span span class token class name CMFCApplication3Dlg span span class token doubl
  • 目标物体缩放方法

    目标物体缩放方法 1 移动相机位置改变视场角 1 移动相机位置 最容易想到的方法是通过改变相机的位置 xff0c 将相机靠近或者远离目标物体从而实现物体大小的放大或者缩小 如下图所示 xff1a 改变视场角 视场角FOV xff08 Fie
  • gamma校正

    伽玛校正 xff08 Gamma Correction xff09 校正的目的输入转至线性空间输出前进行校正衰减 校正的目的 保证所有的输入都转换到线性空间 xff0c 并在线性空间下做各种光照计算 xff08 线性空间进行操作 xff09

随机推荐

  • d3d11释放问题

    d3d11释放问题 释放过程中遇到明明已经调用release xff08 xff09 但是内存却没有下降 xff0c 后来查看了其计数器n发现其不为0 xff0c 也就是没释放干净 xff0c 只是内部引用数减1 span class to
  • imgui显示中文

    imgui显示中文 首先先加载中文字体 span class token comment Load Fonts span io span class token punctuation span Fonts span class token
  • serialVersionUID作用

    原文出处 xff1a 未知 Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的 在进行反序列化时 xff0c JVM会把传来的字节流中的serialVersionUID与本地相应实体 xff08 类
  • linux命令与makefile学习

    linux命令与makefile学习 文件权限通配符 常用命令查看CPU 内存占用makefilegcc与g 43 43 区别 xff1a Linux上有一句话 xff1a 一切皆文件 普通文件 目录文件 d xff08 directory
  • VS在输出窗口显示信息

    输出窗口的信息传给函数 xff0c 函数内部调用系统函数OutputDebugString xff0c 就可以把调试信息打印到输出窗口 span class token keyword void span span class token
  • 使用 nlohmann 解析 json 文件

    使用 nlohmann 解析 json 文件 nlohmann json的配置json基本数据结构json文件的读取 构造与输出C 43 43 对象与nlohmann json对象的转换C 43 43 对象转换成nlohmann json对
  • ImGui实现Button高亮

    ImGui实现Button高亮 记录下在ImGui中实现Button高亮的操作 xff0c 跟着官方demo走没看到具体的实现方式 xff0c 想着渲染是不断进行的 xff0c 让下一帧绘制上次选择的状态 结果如下 xff1a 部分代码 s
  • HLSL笔记

    常量缓冲区 Constant Buffer 常量缓冲区允许C 43 43 端将数据传递给HLSL中使用 xff0c 在HLSL端 xff0c 这些传递过来的数据不可更改 xff0c 因而是常量 常量缓冲区对这种使用方式有所优化 xff0c
  • opengl shader实现Bezier曲线

    opengl shader实现Bezier曲线 顶点着色器片段着色器向shader传递数据 顶点着色器 span class token keyword const span span class token keyword char sp
  • windows创建窗口

    windows创建窗口 CreateWindowW创建窗口句柄窗口可以调节尺寸以及移动完整代码窗口的效果创建指定画面大小 xff0c 不包含窗口栏尺寸且无法调整尺寸的窗口思考 一般来讲 xff0c 要绘制或者渲染目标物体首先需要创建窗口 x
  • makefile文件解释

    makefile文件解释 makefile文件详细解释 makefile文件 CC span class token operator 61 span g 43 43 PROGRAM span class token operator 61
  • python实现自动化鼠标点击

    python实现自动化鼠标点击 span class token keyword import span pyautogui span class token keyword import span time span class toke
  • opengles共享纹理

    OpenGL ES 3 0中引入的 外部纹理 xff08 External Textures xff09 扩展 xff0c 允许将OpenGL纹理对象绑定到由外部API创建的纹理对象 xff0c 例如相机采集到的图像 视频流或其他图像数据
  • https 证书工具 Letsencrypt 简单教程

    https取代http是大势所趋 xff0c https的好处本文不在赘述 xff0c 很多公司和机构都在推进这一进程 xff0c Apple公司甚至规定 xff0c iOS上的App应用必须使用https 因此 xff0c 正是受到App
  • Linux简单命令使用笔记

    之前一直用虚拟机 xff0c 其实购买一台阿里云服务器学习linxu更加的方便快捷 阿里云服务器购买 1 electerm连接登录linux SecureCRT和SFTP 最近linux连接工具electerm 上面是两款不同的连接linu
  • 软件工程的十大模型

    1 软件生命周期模型 软件生命周期由软件定义 软件开发与运维 xff08 也称软件维护 xff09 3个时期组成 xff0c 每个时期又进一步划分成若干个阶段 问题定义 xff1a 要解决的问题是什么 xff1f 通过对客户的访问调查 xf
  • WEEK6 限时测试A - 掌握魔法の东东 II

    A 掌握魔法 东东 II 题目描述 从瑞神家打牌回来后 xff0c 东东痛定思痛 xff0c 决定苦练牌技 xff0c 终成赌神 xff01 东东有 A B 张扑克牌 每张扑克牌有一个大小 整数 xff0c 记为a xff0c 范围区间是
  • WEEK13 作业 A - TT 的神秘任务1(必做)

    A TT 的神秘任务1 xff08 必做 xff09 题目描述 这一天 xff0c TT 遇到了一个神秘人 神秘人给了两个数字 xff0c 分别表示 n 和 k xff0c 并要求 TT 给出 k 个奇偶性相同的正整数 xff0c 使得其和
  • WEEK14 作业 C - Q老师的考验(必做)

    C Q老师的考验 xff08 必做 xff09 题目描述 Q老师 对数列有一种非同一般的热爱 xff0c 尤其是优美的斐波那契数列 这一天 xff0c Q老师 为了增强大家对于斐波那契数列的理解 xff0c 决定在斐波那契的基础上创建一个新
  • 程序设计与实践 模拟题四 201809-3 元素选择器

    201809 3 元素选择器 题目描述 题解 本题是一道思维难度不大的模拟题 实现过程和思想都比较简单 xff0c 具体实现比较难 xff0c 认真仔细即可 xff08 但是自己一开始写的代码只得了80分 xff0c 又比较了其他人的代码才