【CSP201809-3】元素选择器【模拟】

2023-05-16

题意

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


思路:

用point来存储结构化文档,里面string label,string id为标签和id,int c为所在层数,两个点就为一层。
读入结构化文档:用getline读入一行,然后计算出点的个数,层数就为点的个数除以2。接下来读入label,因为label大小写不敏感,将其全部转换为小写。如果字符串还有剩余,则读入id。
接下来读入查询信息,然后进行处理,按空格把字符串分开,放在vector v里。然后将v中的所有标签(不以#开头)转换为小写。再从后往前遍历结构化文档,找到匹配最后一个查询的元素,然后寻找其祖先,如果祖先全部匹配,则该元素符合条件,加入到vector ans中。
因为答案是从后往前放入ans的,所以输出时要倒序输出vector ans。


总结:

一道稍微复杂一点的模拟题,因为n范围很小所以不用考虑是否要用复杂度较低的写法。同时写过前端的人可以很好的理解题目。


代码:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int n,m;
struct point
{
	string label,id;	//标签和id
	int c;				//层数
	point() {	}
} node[110];
vector<string> v;	//存放查询
vector<int> ans;	//存放答案
bool solve(int &index,int &c,int vv)	//从node[index]开始查询,层数为c标签/id为v[vv]
{
	//看祖先是否匹配
	for(int i=index; i>=1; i--)
	{
		if(node[i].c<c)	//进入上一层
		{
			c=node[i].c;
			index=i;
			if(node[i].id==v[vv]||node[i].label==v[vv])
				return true;
		}
	}
	return false;
}
int main()
{
	cin>>n>>m;
	getchar();	//吃一个回车
	for(int i=1; i<=n; i++)	//处理结构化文档
	{
		string s;
		getline(cin,s);
		int index=0;
		//记录.的个数
		while(s[index]=='.')
			index++;
		node[i].c=index/2;	//层数为.的个数/2
		//读入label
		string label;
		while(s[index]!=' '&&index<s.size())
			label=label+s[index],index++;
		//label大小写不敏感,将其转换为小写
		for(int j=0; j<label.size(); j++)
			if(label[j]>='A'&&label[j]<='Z')
				label[j]=label[j]-'A'+'a';
		node[i].label=label;
		//读入id
		if(index<s.size())
		{
			string id;
			index++;	//加之前是空格
			while(index<s.size())
				id=id+s[index],index++;
			node[i].id=id;
		}
	}
	for(int i=1; i<=m; i++)	//读入查询
	{
		string s;
		getline(cin,s);
		v.clear();
		ans.clear();
		//对s进行处理,按空格分开字符串
		int index=0;
		while(index<s.size())
		{
			string s1;
			while(index<s.size()&&s[index]!=' ')
				s1=s1+s[index],index++;
			v.push_back(s1);
			if(index<s.size()&&s[index]==' ')
				index++;
		}
		//将标签变为小写
		for(int j=0; j<v.size(); j++)
			if(v[j][0]!='#')
				for(int k=0; k<v[j].size(); k++)
					if(v[j][k]>='A'&&v[j][k]<='Z')
						v[j][k]=v[j][k]-'A'+'a';
		//从后往前遍历,找到匹配最后一个查询的元素
		//然后寻找其祖先,如果祖先全匹配,则该元素符合条件
		for(int j=n; j>=1; j--)
		{
			if(node[j].id==v[v.size()-1]||node[j].label==v[v.size()-1])	//匹配
			{
				//看祖先是否全部匹配
				int idx=j,c=node[j].c,vv=v.size()-2;
				while(vv>=0)
				{
					if(!solve(idx,c,vv))
						break;
					vv--;
				}
				if(vv==-1)
					ans.push_back(j);
			}
		}
		cout<<ans.size();
		for(int j=ans.size()-1; j>=0; j--)
			cout<<" "<<ans[j];
		cout<<endl;
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【CSP201809-3】元素选择器【模拟】 的相关文章

随机推荐

  • 转载:VUE3使用keep-alive页面切换时报错:TypeError: parentComponent.ctx.deactivate is not a function

    这是VUE官方示例代码 xff1a span class token tag span class token tag span class token punctuation lt span router view span span c
  • vue3的reactive重新赋值无效的问题

    Vue3 官方的文档说明 xff1a reactive 返回一个对象的响应式代理 所以 reactive 方法应该作用于一个对象Object xff0c 如果要使用数组 xff0c 则需要包装一下 xff1a span class toke
  • vue-cli 项目热重载(热更新)失效的解决方法

    一般用vue cli自动构建的项目是默认开启了热更新了 xff0c 如果你手动修改了一些配置 xff0c 是可以关闭的 xff0c 比如在 vue config js 里面的 devServer 下可以配置 span class token
  • vue在引入外部js文件时可以使用this的方法

    在使用iview的table组件时 xff0c 需要从外部引入column js文件 xff0c 发现在外部文件种无法使用 this xff0c 参考了一下网上的文章 xff0c 写了以下方法 xff1a 1 首先在外部js文件中加入一个内
  • 解决 npm ERR! node-sass 和 gyp ERR! node-gyp 报错问题

    一 需要安装 msbuild 微软构建工具 span class token function npm span span class token function install span windows build tools span
  • Permutation 排列组合,主要是字符串的排列offer上的题目,还有leetcode的组合

    一个简洁版的结果过程说明 xff0c 固定一个位 xff0c 变换其他位 a b c d a b d c a c b d a c d b a d c b a d b c void perm char list int i int n int
  • winpcap编程函数介绍

    1 int pcap findalldevs pcap if t char 说明 xff1a 用来获得网卡的列表 参数 xff1a 指向pcap if t 类型的列表的指针的指针 char型指针 当打开列表错误时返回错误信息 返回值 为in
  • shell脚本实现数据库自动备份

    自动备份参考一 三步骤即可 xff0c 二步骤实现备份成功的同时推送消息到钉钉群 xff08 可省略 xff09 一 shell脚本实现数据库自动备份内容如下 xff08 我将脚本名称命名为back sh xff09 xff08 可复制以下
  • 【Week4 CSP B】咕咕东想吃饭【模拟】

    题意 xff1a 一共有n天 xff0c 每天需要买ai个生煎 共有两种购买方式 xff1a 在某一天一次性买两个 xff0c 或者为今明两天各买一个 每种购买方式都可以使用无数次 请问是否能每天恰好买ai个生煎 xff08 最后一天不能用
  • 【Week4 CSP C】可怕的宇宙射线【dfs剪枝】

    题意 xff1a 宇宙射线会在无限的二维平面上传播 xff08 可以看做一个二维网格图 xff09 xff0c 初始方向默认向上 宇宙射线会在发射出一段距离后分裂 xff0c 向该方向的左右45度方向分裂出两条宇宙射线 xff0c 同时威力
  • 【Week4作业 A】DDL的恐惧【贪心】

    题意 xff1a 有n个作业 1 lt 61 n lt 61 1000 xff0c 每个作业都有自己的DDL与平时分 请安排做作业的顺序 xff0c 拿到最多的平时分 输入 xff1a 共T个测试样例 xff0c 每个测试样例共三行 xff
  • 【Week5作业 C】平衡字符串【尺取法】

    题意 xff1a 一个长度为n xff08 n是4的倍数 xff09 的字符串s xff0c 其中仅包含 Q W E 39 R 四种字符 若四种字符在字符串中出现次数均为n 4 xff0c 则其为一个平衡字符串 现可以将s中连续的一段子串替
  • 【Week8作业 A】区间选点II【差分约束】

    题意 xff1a 给定一个数轴上的n个区间 xff0c 要求在数轴上选取最少的点使得第i个区间 ai bi 里至少有ci个点 1 lt 61 n lt 61 50000 0 lt 61 ai lt 61 bi lt 61 50000 1 l
  • 【Week8作业 B】猫猫向前冲【拓扑排序】

    题意 xff1a 一共n只猫猫 xff0c 编号依次为1至n 有m场猫猫比赛 xff0c p1 p2表示猫猫p1赢了猫猫p2 现求字典序最小的名次序列 思路 xff1a 猫猫之间的胜负关系可以构成一张有向无环图 xff0c p1赢了p2等价
  • 【Week8作业 C】班长竞选【SCC缩点】

    题意 xff1a 大学班级选班长 xff0c n个同学均可以发表意见 若意见为A B xff0c 则表示A认为B合适 意见具有传递性 xff0c 即A认为B合适 xff0c B认为C合适 xff0c 则A也认为C合适 共m条意见 xff0c
  • 【Week9作业 A】咕咕东的目录管理器【模拟】

    题意 xff1a 咕咕东的雪梨电脑的操作系统在上个月受到宇宙射线的影响 xff0c 时不时发生故障 xff0c 他受不了了 xff0c 想要写一个高效易用零bug的操作系统 这工程量太大了 xff0c 所以他定了一个小目标 xff0c 从实
  • 【Week12作业 B】必做题-2【模拟】

    题意 xff1a zjm被困在一个三维的空间中 现在要寻找最短路径逃生 xff01 空间由立方体单位构成 zjm每次向上下前后左右移动一个单位需要一分钟 xff0c 且zjm不能对角线移动 空间的四周封闭 zjm的目标是走到空间的出口 是否
  • 【Week12作业 C】必做题-3【动态规划】

    题意 xff1a 东东每个学期都会去寝室接受扫楼的任务 xff0c 并清点每个寝室的人数 每个寝室里面有ai个人 1 lt 61 i lt 61 n 从第i到第j个宿舍一共有sum i j 61 a i 43 43 a j 个人 这让宿管阿
  • selenium重要功能应用

    当使用C 编写爬虫时 xff0c 以下是一些常用的爬虫框架 xff1a AngleSharp xff08 用于HTML解析 xff09 HtmlAgilityPack xff08 用于HTML解析 xff09 ScrapySharp xff
  • 【CSP201809-3】元素选择器【模拟】

    题意 思路 xff1a 用point来存储结构化文档 xff0c 里面string label string id为标签和id xff0c int c为所在层数 xff0c 两个点就为一层 读入结构化文档 xff1a 用getline读入一