CCF201809-3 元素选择器

2023-05-16

试题编号:201809-3
试题名称:元素选择器
时间限制:1.0s
内存限制:256.0MB
问题描述:




 

版本一(时间:2018.10.23)(推荐版本二)

 

分析

大模拟,与往年相比这道题难度有所下降,比较好懂,但要注意一个细节就是一个元素的祖先是紧接着其上的缩进小于等于其缩进的那些元素(连续的区域)中的缩进小于其缩进的元素(没有等于的元素,等于的元素只是起一种连接作用),具体看程序

 

C++程序

#include<iostream>
#include<map>
#include<cstring>
#include<vector>
#include<ctype.h>
#include<string>
 
using namespace std;
 
const int N=105;
 
struct Node{
	string lable,id;
	int d;//缩进 
}a[N];
 
vector<string>demand;
map<string,int>an,query;//an表示各个祖先含有的标签,id属性等,query表示要查询的 

//将字符串s化为小写串 
string mystrlwr(string s)
{
	for(int i=0;i<s.length();i++)
	  s[i]=tolower(s[i]);
	return s;
}
 
//以空格进行分割字符串s,并将分割结果保存在向量v中 
void split(char *s,vector<string>&v)
{
	v.clear();
	char *p=strtok(s," ");
	while(p){
		v.push_back(p);
		p=strtok(NULL," "); 
	}
}
 
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	getchar();//读取回车 
	for(int i=1;i<=n;i++){
		string s;
		getline(cin,s);
		//统计缩进
		int cnt=0;
		for(int j=0;j<s.length()&&s[j]=='.';j++,cnt++);
		//获取标签
		int len=0,pos=-1;//如果有#,pos就记录#的下标 
		for(int j=cnt;j<s.length();j++,len++)
		  if(s[j]==' '){
		  	if(j+1<s.length()&&s[j+1]=='#')
		  	  pos=j+1;
		  	break;
		  }
		a[i].d=cnt;
		a[i].lable=s.substr(cnt,len);
		//由于标签的匹配大小写不敏感,因此化为小写 
		a[i].lable=mystrlwr(a[i].lable);
		if(pos==-1)//如果没有id属性,就让id="" 
		  a[i].id="";
		else
		  a[i].id=s.substr(pos);
	}
	while(m--){
		char d[100];
		gets(d); 
		split(d,demand);
		vector<int>ans;
		if(demand.size()==1){//不是后代选择器,直接进行匹配 
			string q=demand[0];
			if(q[0]!='#')//查询标签大小写不敏感
			  q=mystrlwr(q);//化为小写  
			//进行匹配
			for(int i=1;i<=n;i++)
			  if(q==a[i].lable||q==a[i].id)
			    ans.push_back(i); //保存行号 
		}
		else{
			query.clear();
			for(int i=0;i<demand.size()-1;i++){
				//统计各种标签,id属性的个数 
				if(demand[i][0]!='#')//如果是标签就化成小写 
				  demand[i]=mystrlwr(demand[i]);
				query[demand[i]]++;
			} 			
            string q=demand.back();
			if(q[0]!='#')//查询标签大小写不敏感
			  q=mystrlwr(q);//化为小写  
			//进行匹配
			for(int i=1;i<=n;i++)
			  if(q==a[i].lable||q==a[i].id){
			  	//获取a的祖先结点的标签和id属性
				  an.clear();
				  for(int j=i-1;j>0&&a[j].d<=a[i].d;j--){
                    if(a[j].d==a[i].d)continue;//关键:细节
				  	an[a[j].lable]++;//由于标签不会为空,因此直接加一 
				  	if(a[j].id!="")//只将不为空的id进行加一 
				  	  an[a[j].id]++;
				  }
				//判断是否符合条件
				bool flag=true;
				//遍历查询的所有id选择器和标签选择器 
				for(map<string,int>::iterator it=query.begin();it!=query.end();it++)
				  if(an.count(it->first)==0||an[it->first]<it->second){//如果i的祖先没有或者有但是个数不够 
				  	flag=false;
				  	break;
				  }
				if(flag)
				  ans.push_back(i); 
			  }
		}
		printf("%d",ans.size());
		for(int i=0;i<ans.size();i++)
		  printf(" %d",ans[i]);
		printf("\n");
	}
	return 0;
} 

 

版本二(时间:2019.03.07

 

分析

解决评论区的问题,具体看程序

C++程序

#include<iostream>
#include<string>
#include<cstring>
#include<vector>
 
using namespace std;
 
const int N=105;
 
struct Node{
	string lable,id;//标签和属性 
	int cnt;//缩进 
}a[N];
 
//将字符串化成小写 
void mystrlwr(string &s)
{
	for(int i=0;i<s.length();i++)
	  s[i]=tolower(s[i]);
}
 
//在数组a中[1,start]寻找缩进小于cnt,且标签或属性等于s的元素 
bool search(Node a[],int &start,int &cnt,string s)
{
	for(int i=start;i>=1;i--)//遍历 
	{
		if(a[i].cnt<cnt) 
		{
			//查询成功
			cnt=a[i].cnt,start=i;//保证a[i]是它的父亲,即第一个缩进小于它的元素 
			if(s==a[i].lable||s==a[i].id) return true;//成功 
		}
	}
	return false;//查询失败 
}
 
int main()
{
	int n,m;
	string s;
	cin>>n>>m;//读入n和m 
	getchar();//读取换行符 
	for(int i=1;i<=n;i++)
	{
		getline(cin,s);
		//pos1记录标签的起始位置,pos2记录id属性的起始位置,cnt记录缩进 
		int pos1=-1,pos2=-1,cnt=0; 
		for(int j=0;j<s.length();j++)
		  if(s[j]=='.')
		    cnt++;
		  else if(pos1==-1&&s[j]!='#')
		    pos1=j;
		  else if(s[j]=='#')
		    pos2=j;
		a[i].cnt=cnt;
		if(pos2==-1)//如果不存在id属性 
		{
			a[i].lable=s.substr(pos1);
			a[i].id="";//置为空 
		}
		else//存在id属性 
		{
			a[i].lable=s.substr(pos1,pos2-pos1-1);
			a[i].id=s.substr(pos2);
		}
		mystrlwr(a[i].lable);//由于标签属性大小写不敏感,因此统一换成小写 
	}
	for(int i=0;i<m;i++)//读入m个查询 
	{
		char tmp[100];
		vector<string>query;//存储查询 
		vector<int>ans;//存储结果 
		gets(tmp);//读入 
		char *sp=strtok(tmp," ");//将插叙用空格分割,按序存放在query向量中 
		while(sp)
		{
			query.push_back(sp);
			sp=strtok(NULL," ");
		}
		int len=query.size();
		for(int j=0;j<len;j++)//将标签统一化成小写 
		  if(query[j][0]!='#')  mystrlwr(query[j]);
		for(int j=1;j<=n;j++)//遍历n行元素 
		{
			if(query[len-1]==a[j].id||query[len-1]==a[j].lable)//最后一级选择器匹配了 
			{
				int start=j,cnt=a[j].cnt,k=len-2;//使用search函数匹配各级父选择器 
				for(;k>=0;k--)
				{
					if(!search(a,start,cnt,query[k])) break;
				}
				if(k<0)//成功
				  ans.push_back(j); 
			}
		}
		//输出结果 
		cout<<ans.size();
		for(int j=0;j<ans.size();j++)
		  cout<<" "<<ans[j];
		cout<<endl;
	}
	return 0;
}

 

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

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

  • ubuntu22.04安装vmware tools

    前言 安装VMware Tools经常会出现兼容性不好 xff0c 系统之间复制文件失灵 xff0c 并且安装时提示建议使用open vm tools xff0c 于是放弃vmware tools的安装 xff0c 尝试使用open vm
  • ubuntu22.04安装ibus中文输入法

    前言 IBus xff08 英文全称为Intelligent Input Bus xff09 xff0c 是GNU Linux和类UNIX操作系统下的以GPL协议分发源代码的开源免费多语言输入法框架 首先 在安装中文输入法之前 xff0c
  • 信息安全之数字信封原理

    概述 一般来说对称加密算法的密钥短 xff0c 加密算法简单 xff0c 适用于大量数据加密的场合 xff0c 在现在的技术条件下比较容易破解 xff1b 相比较而言非对称加密的密钥长 xff0c 加解密算法复杂 xff0c 很难破解 xf
  • 信息安全之信息摘要技术

    什么是信息摘要 xff1f 指一段数据的特征信息 xff0c 当数据发生了改变 xff0c 信息摘要也会发生改变 信息摘要是由哈希函数生成的 主要为了保证数据的完整性 xff0c 保证接收到的数据不被篡改 常见的摘要计算方法有MD5 128
  • 信息安全技术之数字签名

    什么是数字签名 xff1f 就类似于生活中公司发布一些文件 放假通知啥的 xff0c 老板会在文件的后面签名或者会盖上公司的印章 xff0c 目的就是标识这个文件是公司发布的 在计算机中我们没办法像真实世界那样签名 xff0c 这时候我们就
  • 设置Mysql C API断线自动重连

    Mysql的C API自带重连功能 xff0c 执行语句时发现连接断开 xff0c mysql库会尝试重连 xff0c 并重新执行语句 使用mysql options函数设置MYSQL OPT RECONNECT选项可以开启自动重连功能 默
  • mysql_query()和myql_real_query()的区别

    函数原型 span class token keyword int span span class token function mysql query span span class token punctuation span MYSQ
  • mysql_store_result和mysql_use_result的区别

    mysql store result 本次查询的所有结果都缓存到客户端 xff0c 这样做的好处是可以随意的访问结果中的值 xff0c 例如可以使用mysql data seek 和mysql row seek 访问任意位置的数据或者行 同
  • linux下实时跟踪文件变化tail指令

    很多时候我们程序进入后台之后 xff0c 日志信息会写入到文件中 此时如果用一般的文件操作指令 例如cat xff0c 手动的一次一次的查看 tail命令在这个时候就非常有用 span class token comment 使用 f参数指
  • 【教程】老主板可以用上Nvme协议的固态硬盘?当然可以!!!!(注意:只适用于支持UEFI BIOS的主板)

    如今固态硬盘分为SATA协议和Nvme协议的 xff0c 虽然SATA协议的固态硬盘已经可以满足大多数用户的需求 xff0c 但是和Nvme协议的固态硬盘比起来差别还是很大的 xff0c SATA协议的固态硬盘最多500 600MB s的传
  • 解决windeployqt打包QML程序无法启动的问题

    windeployqt exe是qt自带的打包工具 xff0c 在打包qml程序时需要带上 qmldir参数 xff0c 指定qml导入符号的路径 xff0c 否则会出现无法启动的问题 windeployqt xxx exe qmldir
  • windows下如何找到占用文件或文件夹的程序

    我们在操作一个文件或文件夹时 xff0c 经常会遇到被占用的问题 xff0c 如下图 绝大部分情况下我们知道是那些程序占用 xff0c 可以直接关闭他 xff0c 但是也有很多时候我们不知道是哪个程序占用的 xff0c 可以用下面的方式来解
  • 正则表达式的零宽断言

    概念 断言 xff1a 就是说正则可以指明在指定的内容的前面或后面会出现满足指定规则的内容 零宽 xff1a 代表断言是一个占位符 xff0c 并不会在查找结果中输出 实例 使用的测试原文如下 xff1a lt w t gt 测试1 lt
  • 如何在Qt中使用zlib

    前言 环境 xff1a qt5 9 9 zlib1 2 1 windows10 QtCreator4 11 0 本文介绍了在Qt中使用zlib的方式 使用的场景是在上位机软件中使用解压缩功能 点击此处下载本文完整的示例代码 问题 比较麻烦的
  • 如何在程序中解析获取word文档(docx格式)的文本内容

    原理 docx格式的word文档其实是一个压缩包 xff0c 文本内容 格式 图片等是分别存储在不同的文件中的 xff0c office通过这些文件还原出我们所看到的word文档 下面以一个简单的示例来说明docx格式 示例 首先我们新建一
  • QFormLayout布局该什么时候使用

    概述 QFormLayout是一种支持两列的格子布局方式 xff0c 左列是标签 xff0c 右列是窗口部件 可以方便且快速的实现标签和输入组件的组合 xff0c 如下图 示例 像上面的例子 xff0c 使用QGridLayout 栅格布局
  • Qt判断文件类型 QMimeType

    前言 通常来说我们判断一个文件的类型是根据后缀名称来的 xff0c 例如 xff1a txt是文本文件 exe是二进制文件可执行程序 在程序中需要预设后缀名称 xff0c 有些时候不太容易把属于某类文件的后缀名写全 比如说图片类型的文件 x
  • 在qmake中定义子项目的编译顺序(依赖关系)

    背景 当一个大项目中包含多个子项目时 xff0c 往往子项目之间有依赖关系 xff0c 这时需要在pro文件中指明子项目的编译顺序 xff0c 否则编译整个项目的时候可能会失败 实现 现有项目一名称为Porject1 xff0c 包含三个子
  • lua面向对象-----继承的实现

    前言 在lua里是没有类的概念的 xff0c 但是可以利用表 xff08 table xff09 和元表特性来实现面向对象和继承 lua的表类似于一个对象 xff0c 每个对象都有自己的方法和属性 当访问一个表中不存在的属性时 xff0c
  • 使用Qt实现阿里云API签名

    最近需要使用阿里云API来访问物联网平台 xff0c 但是阿里官方的C 43 43 版API有些复杂而且编译有些问题 xff0c 所以决定自己来实现 xff0c 这里主要就是要解决签名的问题 xff0c 下面把签名实现的部分分享一下 使用示

随机推荐

  • Ubuntu下dpkg安装软件遇到包依赖问题的处理方法

    在Ubuntu环境下通过dpkg命令安装deb包时 xff0c 如果遇到包依赖问题 xff0c 如 sudo dpkg i xxx deb Reading database 227173 files and directories curr
  • proxmox VE备份优化手记--两次优化,大幅度提高性能

    问题描述 某项目由两套proxmox组成 xff0c 一套运行所有的应用程序 xff0c 一台运行mysql数据库 为了保险起见 xff0c proxmox外挂共享存储 xff0c 夜间对所有的虚拟机进行自动备份 备份是用的一台4U服务器
  • 开源超融合私有云神器proxmox VE

    Prxomox VE由位于奥地利维也纳的Proxmox Server Solutions GmbH开发 xff0c 这让人有点意外 其实欧洲在IT技术方面 xff0c 还是很强的 xff0c 比如大名鼎鼎的mysql xff0c 出自瑞典
  • Proxmox VE 桌面虚拟化(windows 10)集群尝试

    一家小型企业 内部有几台服务器 办公电脑40几台 这些服务器都是单点 经历过一次财务服务器损坏 好几周都不能开展业务的惨痛教训 正对这种问题 可采用proxmox超融合集群来解决业务高可用问题 但考虑到它的业务服务器数量不多 用超融合集群专
  • Promox VE日常维护

    Promox VE超融合私有云部署并用于生产系统以后 并不能一劳永逸 这仅仅是万里长征走完了第一步 虽然超融合私有云本身提供了非常高的可用性 但并不保证整个系统在运行中不会整体崩溃 因此 好的系统加上好的维护 才是正途 Promox VE超
  • PBS(proxmox backup server)尝鲜记

    作者 xff1a 田逸 xff08 vx xff1a formyz xff0c mail xff1a sery 64 163 com xff09 终于等到pbs发布正式版本pbs 1 0 迫不及待去官网下载好proxmox backup s
  • 打造炫酷的Proxmox VE 监控界面

    打造炫酷的Proxmox VE 监控界面 今天终于把Proxmox VE xff08 简称PVE xff09 从6 1版本升级到PVE 6 4版本 xff0c 在Web管理后台对比PVE 6 4与 PVE 6 1 xff0c 看新增哪些功能
  • Proxmox VE 多机系统备份

    作者 xff1a 田逸 在我管控的项目里 xff0c 有Proxmox VE集群 xff0c 也有些单独的PVE 我打算把集群上的虚拟机 单机PVE上的虚拟机 xff0c 都备份到同一个大容量存储 这样规划 xff0c 即能有效利用资源 x
  • Proxmox VE 超融合集群实践真传

    第1章 老司机眼中的私有云 3 1 1私有云的定义 3 1 2私有云适用场景 4 1 3私有云行业现状 6 1 4私有云技术要求 xff08 针对Proxmox VE平台 xff09 7 第2章 开源私有云神器Proxmox VE 8 2
  • Proxmox VE 超融合集群创建多个Ceph Pool

    作者 xff1a 田逸 xff08 vx formyz xff09 创建多Ceph Pool的目的 Proxmox VE集群上的虚拟机运行在高速磁盘NVME 而虚拟机附属的数据 xff0c 则指定到低速 廉价 容量大的磁盘空间 为了高可用性
  • Proxmox VE 超融合集群OVS(Open vSwitch)虚拟机网络隔离

    作者 xff1a 田逸 需求的产生 在一个高配置的Proxmox VE 超融合集群中 xff0c 为充分利用资源 xff0c 需要按某种需求将虚拟机之间进行网络隔离 xff0c 以支持更大规模的场景 网络虚拟化基本条件 支持VLAN的网络交
  • 第1章 Rust安装

    Rust是一门安全的语言 xff0c 最近也加入到Linux内核中 xff0c 因此后续这门语言会越来越流行 xff0c 所以准备学习下 xff0c 本篇介绍Rust在Window平台上的安装过程 目录 安装步骤 1 到官网下载安装包 2
  • Proxmox VE 7.0升级到Proxmox VE 7.1虚拟机重启失败

    一单节点pve xff0c 版本为7 0 xff0c 顺手刷了一下更新 xff0c 升级到版本7 1 因为对其中的一个Centos 7虚拟机执行了yum update 重启此虚拟机 xff0c 启动失败 xff0c 尝试多次皆如此 kvm
  • Proxmox VE 修改集群名称

    作者 xff1a 田逸 xff08 formyz Proxmox VE集群一旦创建 xff0c 其集群的名称就固定下来 在Proxmox VE Web管理后台 xff0c 没有相应的菜单或按钮对应与集群名称的修改 xff08 仅仅发现修改虚
  • 第3章 高可用负载均衡集群规划

    作者 xff1a 田逸 xff08 formyz xff09 开篇之初 xff0c 先举几个反例 xff0c 来说明事前规划的重要性 案例一 xff1a 某广告媒体公司 xff0c 需要部署一套媒体播放系统 xff0c 由一台应用服务器和一
  • 《企业级Linux高可用负载均衡集群实践真传》目录

    第1章 关于负载均衡 2 1 1 负载均衡定义 2 1 2 负载均衡在生产环境中的基本要求 3 1 2 1 在线可扩展性 3 1 2 2 高可用性 3 1 2 3 多服务性 4 1 3 负载均衡基本功能 4 1 3 1 负载均衡 4 1 3
  • 4.3 实施部署Nginx 高可用负载均衡集群

    作者 xff1a 田逸 xff08 formyz xff09 部署大致可分为 xff1a 准备工作 配置 验证与交付几个步骤 xff0c 接下来按顺序逐一介绍 4 3 1 准备工作 Nginx高可以负载均衡集群准备工作分两个层面 xff1a
  • xrdp设置开机自启动 update-rc.d xrdp enable

    xrdp设置开机自启动 update rc d xrdp enable
  • FreeRDP 编译和使用介绍

    FreeRDP 编译和使用介绍 FreeRDP是开源的 xff0c 免费的RemoteDesktop Protocol RDP 执行版本 xff0c 它支持多个操作系统平台如Windows xff0c Linux和Android 源代码下载
  • CCF201809-3 元素选择器

    试题编号 xff1a 201809 3试题名称 xff1a 元素选择器时间限制 xff1a 1 0s内存限制 xff1a 256 0MB问题描述 xff1a 版本一 xff08 时间 xff1a 2018 10 23 xff09 xff08