201809-3元素选择器

2023-10-27

题目链接

题目描述:

样例输入:

11 5
html
..head
....title
..body
....h1
....p #subtitle
....div #main
......h2
......p #none
......div
........p #two
p
#subtitle
h3
div p
div div p 

样例输出:

3 6 9 11
1 6
0
2 9 11
1 11

题目分析:

首先这道题是道模拟,题目很长,关键点有:

  • 文档内容有标签,id属性以及缩进,标签大小写不敏感;id属性以#区分,大小写敏感;每两个..代表一级缩进。
  • 所以用一个结构体数组来存储文档每行内容,结构体有标签lable,id属性id,以及缩进d。再者,因为每行文档内容包含空格,所以用getline读入一整行,然后再划分出lable,id,d各部分内容(此处需要用到字符串复制函数substr,同时,因为lable大小写不敏感,所以需要将lable全部转换为小写或大写,此处采用的是前者,全部转换为小写,需要用到的字符串转换小写函数为tolower字符串函数讲解
  • 选择器有三种类型,标签选择器,id选择器以及后代选择器。后代选择器A B表示满足选择器B的所有元素,且满足这些元素有祖先满足选择器A。
  • 同样,因为每行选择器内容包含空格,所以用getline读入一整行,然后再根据空格划分各部分内容(此处需要用到字符串分隔函数strtok,需要注意的是strtok函数的参数是char*类型,而输入的是string类型,所以需要在应用strtok函数之前,语句加上strcpy(str,b.c_str());)同样,因为lable大小写不敏感,用字符串转换小写函数tolower将lable全部转换为小写。
  • 标签选择器和id属性选择器都可以直接将选择器内容与文档内容逐一比较得出答案,难点在于后代选择器,根据后代选择器的定义,从选择器的末端出现,先判断找出满足末端的所有元素,然后进一步找出这些元素的祖先(祖先的判定条件为d<a[i].d),一层一层往上递进。每一层只要有一个祖先满足即可。最后如果对于元素选择器的所有内容都满足,那么这个元素是符合题意的,ans++。(根据提示,采用贪心算法,找到一个匹配层级数最小的即可)
  • 因为在寻找祖先的时候,是要一层一层往上的,所以需要更新现代元素,所以函数match采用的是&,对应存储单元地址)

代码:

#include<iostream>
#include<stdio.h>
#include<string>
#include<vector>
#include<string.h>
using namespace std;
const int maxn=110; 
struct word
{
	string lable;//标签 
	string id;//id 
	int d;//缩进 
}a[maxn];
vector<string> q;
vector<int> r;
int match(int &index,string s,int &d)//查找祖先 
{
	for(int i=index;i>0;i--)
	{
		if(a[i].d<d)//缩进小于 是祖先 
		{
			index=i;
			d=a[i].d;
			if(a[i].lable==s||a[i].id==s)//存在祖先元素满足S
			{
				//cout<<"i:*****"<<i<<endl;
				return 1;
			} 
		}
	}
	return 0;
} 
int main()
{
	int n,m;//行数和待查找选择器数 
	cin>>n>>m;	
	string s;//元素 
	string b;//选择器 
	cin.get();//读取换行符 
	for(int i=1;i<=n;i++)
	{
		getline(cin,s);
		//cout<<s<<endl;
		int cnt1=-1;//标签开始位置 
		int cnt2=-1;//属性开始位置 
		for(int j=0;j<s.size();j++)
		{	
			if(s[j]=='.')
			{
				a[i].d++;
			}
			else if(s[j]!='#'&&cnt1==-1)
			{
				cnt1=j;
			}
			else if(s[j]=='#')
			{
				cnt2=j;
			} 
		}
		a[i].d=a[i].d/2;//两个..为一层缩进 
		if(cnt2!=-1)//有id属性 
		{
			a[i].lable=s.substr(cnt1,cnt2-cnt1-1);
			for(int j=0;j<a[i].lable.size();j++)
			{
				a[i].lable[j]=tolower(a[i].lable[j]);
			}
			a[i].id=s.substr(cnt2);
		}
		else//没有id属性 
		{
			a[i].lable=s.substr(cnt1);
			for(int j=0;j<a[i].lable.size();j++)
			{
				a[i].lable[j]=tolower(a[i].lable[j]);
			}
			a[i].id="";
		}
		//cout<<a[i].lable<<" "<<a[i].id<<" "<<a[i].d<<endl;
	}
	
	//cin.get();
	for(int i=1;i<=m;i++)
	{
		q.clear();
		r.clear();
		getline(cin,b);
		char *pch;
		char str[128];
		strcpy(str,b.c_str());
		pch=strtok(str," ");
		while(pch!=NULL)
		{
			//cout<<pch<<endl;
			if(pch[0]!='#')
			{
				for(int j=0;j<strlen(pch);j++)
				{
					pch[j]=tolower(pch[j]);
				}
			}
			
			q.push_back(pch);
			pch=strtok(NULL," ");
		}
		int len=q.size();
		for(int j=n;j>0;j--)
		{
			if(a[j].lable==q[len-1] || a[j].id==q[len-1])//后代匹配 
			{
				int k;
				bool flag=true;
				int d=a[j].d;int in=j;
				for(k=len-2;k>=0;k--)
				{
					if(!match(in,q[k],d))
					{
						flag=false;
						break;
					}
				}
				if(flag)//符合 
				{
					r.push_back(j);
					//cout<<j<<endl;
				}
			}
		}
		int length=r.size();
		cout<<length<<" ";	
		for(int j=length-1;j>=0;j--)
		{
			if(j>0)
			{
				cout<<r[j]<<" ";
			}
			else
			{
				cout<<r[j];
			}	
		}
		cout<<endl;	
	}	
	return 0;
} 

/*

11 5
html
..head
....title
..body
....h1
....p #subtitle
....div #main
......h2
......p #none
......div
........p #two
p
#subtitle
h3
div p
div div p 

3 6 9 11
1 6
0
2 9 11
1 11
*/ 

 

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

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

  • 【程序设计】设计模式

    文章目录 概述 分类 创建型模式 Creational Patterns 结构型模式 Structural Patterns 行为型模式 Behavioral Patterns 各分类中的模式的关键点 策略模式与状态模式 策略模式与简单工厂
  • Acwing - 131. 直方图中最大的矩形

    131 直方图中最大的矩形 AcWing题库 题目描述 tag 单调栈 直方图是由在公共基线处对齐的一系列矩形组成的多边形 矩形具有相等的宽度 但可以具有不同的高度 例如 图例左侧显示了由高度为 2 1 4 5 1 3 3 的矩形组成的直方
  • 神秘又熟悉的main函数

    目录 1 概述 2 程序编译 3 揭开最后的面纱 1 概述 学习C语言的同学都知道main函数 并且这是我们接触的第一个函数 但是很少有人去深究C语言为什么都是从main函数执行的 今天我们就来深入了解下 2 程序编译 C语言生成可执行文件
  • “Python小屋”1300篇历史文章分类速查表

    总体说明 各分类中的文章是按发布时间逆序排列的 动态更新 公众号所有代码均可作为教学案例 转载请注明出处 请勿用作商业用途 快速查找历史文章的方法 1 单击本文右上角的按钮 然后在弹出的窗口中选择 搜索页面内容 然后输入要找的关键字即可 董
  • PTA 浙大版《C语言程序设计(第3版)》题目集 练习5-2

    本题要求对两个整数a和b 输出其中较大的数 函数接口定义 int max int a int b 其中a和b是用户传入的参数 函数返回的是两者中较大的数 裁判测试程序样例 include
  • 用c语言编写九九乘法表

    这个需要使用两重循环来实现 我们用i表示行 外面一层循环 for i 1 i lt 9 i 外循环 从第一行到第九行 第一步 输出该行的乘法式子 第二步 该行结束换行 我们只需要将中间2步补充完整即可 第二步换行比较简单 printf n
  • IDEA创建scala项目的三种方法

    转自 https blog csdn net u013850277 article details 78526046 用了好几年的Eclipse 最近想着了解下Scala 听说Intelli JDEA这个工具很强大 因而开始着手试试 Int
  • 第三十八章、PyQt输入部件:QKeySequenceEdit快捷键输入部件使用案例

    专栏 Python基础教程目录 专栏 使用PyQt开发图形界面Python应用 专栏 PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一 功能简介 Key Sequence Edit输入部件是用于输入快捷键序列的一个部件 输
  • C/C++程序算法小练习--大整数减法

    大整数减法 include
  • 程序设计之归并排序

    6 86 归并排序 10 分 本题要求实现二路归并排序中的归并操作 待排序列的长度1 lt n lt 1000 函数接口定义 void Merge SqList L int low int m int high 其中L是待排序表 使排序后的
  • 通过主机名字获取与端口号获取对应的IP地址

    利用boost asio中的库函数获取本地主机的名字和通过主机名字获取与端口号获取对应的IP地址 源代码如下 Boost others network function cpp 此文件包含 main 函数 程序执行将在此处开始并结束 inc
  • 问题: 12名小朋友手拉手站成一个圆圈,从第一名小朋友开始报数,报到7的退出,然后重复直到剩下最后一名小朋友,求该小朋友的编号

    游戏问题 有12名小朋友手拉手站成一个圆圈 从第一名小朋友开始报数 报到7的那名小朋友退到圈外 然后他的下一位重新报1 这样继续下去 直到最后只剩下一名小朋友 问这名小朋友原来站在什么位置上 代码如下 include
  • C语言——时间制转换

    C语言 写一个程序 要求用户输入24小时制的时间 然后显示12小时制的时间 首先我们得搞清楚24小时制和12小时制之间的差异 从上步的差异中 我们得到规律 整理思路 并完成代码 考虑到代码的健壮性和实用性 考虑可能会遇到的问题 比如用户输入
  • C语言:编程实现输入n和n个数,判断其中哪个数连续出现的次数最多

    C语言 编程实现输入n和n个数 判断其中哪个数连续出现的次数最多 分析 代码 分析 需要设置的变量有 n 输入数字的个数 x 输入的数字 cur 当前输入的数 i 计数器 len 连续出现的次数 maxl 最大连续出现的次数 maxx 连续
  • C++程序设计期末考试抱佛脚

    大一上的 今早的计算机概论压中一道大题 我惊呆了 先放 点我看学友的复习总结 if嵌套配对 书p45 内嵌平衡语句 if if else else if else else总是与写在它前面的 最靠近的 尚未与其他else配对的if配对 其他
  • Unity Camera 的跟踪,转动,缩放,代码教程 适合做角色的第一,第三人称视角

    Unity Camera 的跟踪 转动 缩放 代码教程 适合做角色的第一 第三人称视角 1 代码挂载到摄像机 camera上 Player是你要跟踪物体的位置 把你要跟踪的物体放上就行 2 源代码 using UnityEngine usi
  • 1033 旧键盘打字 Python实现

    1033 旧键盘打字 20 20 分 旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输入的一段文字 以及坏掉的那些键 打出的结果文字会是怎样 输入格式 输入在2行中分别给出坏掉的那些键 以及应该输入的文字 其
  • 基于协同过滤推荐+余弦相似度算法实现新闻推荐系统

    针对海量的新闻资讯数据 如何快速的根据用户的检索需要 完成符合用户阅读需求的新闻资讯推荐 本篇文章主要采用余弦相似度及基于用户协同过滤算法实现新闻推荐 通过余弦相似度算法完成针对不同新闻数据之间的相似性计算 实现分类标签 通过协同过滤算法发
  • 第三十九章、PyQt显示部件:OpenGL Widget部件功能简介及使用其显示图片

    专栏 Python基础教程目录 专栏 使用PyQt开发图形界面Python应用 专栏 PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一 概述 OpenGL Widget部件是一个OpenGL Open Graphics L
  • 开源P2P视频流媒体源代码研究

    1 Azureus http azureus sourceforge net 这是java版的betorrent 最新版本2 4 0 2 从网上直接下载的源代码是没法构建的 所用的库没有在包里面 可以到 http azureus cvs s

随机推荐

  • Acwing 898. 数字三角形

    f i j 表示所有从起点开始 走到 i j 的路径中的和的最大值 自上而下到达 i j 有两种路径 一个是左上方 一个是正上方 f i j max f i 1 j 1 a i j f i 1 j a i j 注意边界情况 边界初始化为 I
  • 单机网游架设必学:Win7安装虚拟机详细步骤

    1 下载虚拟机软件 VMware VMware Workstation 中文正式版 10 0 1 137977 2 查了很多资料说虚拟机不会占用磁盘 但是我感觉应该是有影响的 所以这里我特意分出来一个空白的60G盘做测试用 分盘用 Acro
  • PDB文件详解

    PDB文件的介绍 PDB Program Data Base 意即程序的基本数据 是VS编译链接时生成的文件 DPB文件主要存储了VS调试程序时所需要的基本信息 主要包括源文件名 变量名 函数名 FPO 帧指针 对应的行号等等 因为存储的是
  • 强化学习算法 DQN 解决 CartPole 问题,代码逐条详解

    本文内容源自百度强化学习 7 日入门课程学习整理 感谢百度 PARL 团队李科浇老师的课程讲解 强化学习算法 DQN 解决 CartPole 问题 移动小车使得车上的摆杆保持直立 这个游戏环境可以说是强化学习中的 Hello World 大
  • Visual C++ ADO数据库编程入门(1)

    ADO 是目前在Windows环境中比较流行的客户端数据库编程技术 ADO是建立在OLE DB底层技术之上的高级编程接口 因而它兼具有强大的数据处理功能 处理各种不同类型的数据源 分布式的数据处理等等 和极其简单 易用的编程接口 因而得到了
  • 分布式系统详解--框架(Hadoop--RPC协议)

    分布式系统详解 框架 Hadoop RPC协议 在之前的一篇文章当中已经写过一篇文章是关于RPC通信协议的文章 是 分布式系统详解 基础知识 通信 是讲的关于网络通信的最基本的知识 这篇文章也简单讲一下关于hadoop内部的网络通信 一 h
  • 蓝桥杯第四届题目答案

    蓝桥杯第四届省赛javaB组题目答案 第一题 标题 世纪末的星期 曾有邪教称1999年12月31日是世界末日 当然该谣言已经不攻自破 还有人称今后的某个世纪末的12月31日 如果是星期一则会 有趣的是 任何一个世纪末的年份的12月31日都不
  • android instrumentation 原理,理解 android instrumentation

    instrumentation 先看activity的启动过程 Override public void startActivity Intent intent Nullable Bundle options if options null
  • pyqt拖拽获取文件路径

    main py import sys import PyQt5 QtWidgets as qw from mainwindow import Ui MainWindow class TestWindow qw QMainWindow def
  • [UE4]C++中SpawnActor用法(动态创建Actor)

    注 这里创建actor跟unity有明显不同 ue不能创建一个单独的actor 单独的actor也没意义 ue里的actor是用来继承的 这里创建的actor都是实例化actor的子类 细想下 并不影响动态创建对象 ue417用下面的写法貌
  • 【LINUX】i.MX6学习笔记(1) 调试环境搭建(MfgTool) + 学习资料(正点原子 + 韦东山)

    1 引言 说起来 和linux打交道也挺久了 最近3年的主要工作都是在linux下做的应用层开发 在做应用层之前 因为做控制算法的原因 很多东西又是在单片机或者DSP上跑的裸核 二者一合并 中间就出现了一个巨大的断层 就是Linux 驱动
  • [jdbc]DAO及相关实现类

    DAO及相关实现类 DAO BaseDAO java CustomerDAO java CustomerDAOImpl java 测试CustomerDAOImplTest 升级版就是把Customer class 去掉 具体没写 再jdb
  • 数据库之表格(一): 建表-备份-恢复【SQL-Server】

    不求点赞 只求耐心看完 指出您的疑惑和写的不好的地方 谢谢您 本人会及时更正感谢 希望看完后能帮助您理解算法的本质 目录 一 操作一 建立表格 二 操作二 备份表格 三 操作三 恢复导入表格 一 操作一 建立表格 可以都设为 c h a r
  • 静态综合实验

    对未来的真正慷慨 是把一切都献给现在 阿尔贝 加缪 反抗者 静态综合实验 让我们来看看实验的样子 IP地址划分 R3下方电脑DHCP获取IP地址 路由表要尽量小 就要写缺省路由 缺省路由方向要相同 否则出现路由环路 但是缺省路由不能代表所有
  • 光纤通信技术

    目录 1 绪论 2 光纤和光缆 2 1 光纤 1 阶跃型光纤 2 渐变型光纤 3 波动光学分析 4 光纤的基本特性 2 2 光缆 3 光源和光发射机 3 1 光电器件的一般工作原理 3 2 发光二极管 LED 3 3 半导体激光器 LD 3
  • Java集合基础知识必会(一)

    Java集合基础知识 一 Java集合是Java中一种非常重要的数据结构 它提供了一种方便而高效的方式来存储和处理数据 本文将介绍Java集合的基础知识 包括集合框架的概述 常见的集合接口和实现类 以及一些使用案例 集合框架概述 Java集
  • OpenCV 变换整幅图像的warpPerspective()函数——中心化坐标表示

    OpenCV自带的warpPerspective 函数 可以根据透视变换参数实现从一幅图像到另外一幅图像之间的映射变换 OpenCV为了保证坐标的对应关系 在一些情况下 会对变换的图像进行裁剪 以至于不能显示图像全貌 如图1所示 这限制了其
  • A. 运维体系 --- SLA理论体系

    A 运维体系 SLA理论体系 概述 SLA 是服务供应商与客户之间的服务等级协议 它定义了服务供应商应保证的服务质量 以及在服务不达标情况下的服务赔偿 SLA在定义上又细分为SLI SLO与SLA SLI 服务质量指标 服务的某项质量的一个
  • Linux将一个文件夹或文件夹下的所有内容复制到另一个文件夹

    1 将一个文件夹下的所有内容复制到另一个文件夹下 cp r home packageA home cp packageB 或 cp r home packageA home cp packageB 这两种方法效果是一样的 方法示例 2 将一
  • 201809-3元素选择器

    题目链接 题目描述 样例输入 11 5 html head title body h1 p subtitle div main h2 p none div p two p subtitle h3 div p div div p 样例输出 3