CCF CSP认证201809-3 元素选择器

2023-05-16

201809-3 元素选择器

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

思路

多级查询需要用到树形结构,详见代码。

AC代码如下

#include<iostream>
#include<string>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
struct node{//按行存文档(树形结构)
 	vector<int> child;
 	string name,id;
 	int level;//记录层次,用来找父亲节点
}nd[105];
int n,m;

void get_text(int i){//输入第i行文档并分析
 	string line;
 	getline(cin,line);
 	int s=0;
 	int t=line.find("..",s);
 	nd[i].level=1;
 	while(t!=string::npos){
  		nd[i].level++;//每多两个'.'层数加一
  		s=t+2;
  		t=line.find("..",s);
 	}
 	t=line.find(" ",s);//有空格表示有id
 	if(t!=string::npos){
  		nd[i].id=line.substr(t+1,line.size()-t-1);
  		nd[i].name=line.substr(s,t-s);
 	}
 	else nd[i].name=line.substr(s,line.size()-s);
 	transform(nd[i].name.begin(),nd[i].name.end(),nd[i].name.begin(),::tolower);//标签名不区分大小写
 	for(int j=i-1;j>=1;j--){//找父亲节点,往回看,首个level比自己小的就是
  		if(nd[j].level<nd[i].level){
   			nd[j].child.push_back(i);
   			break;
  		}
 	}
}

bool Matched(string str,int x){//匹配
 	if(str[0]=='#'&&str==nd[x].id) return true;
 	if(str==nd[x].name) return true;
 	return false;
}

void search(set<int> &f,string str,int x){//dfs遍历森林,查找符合要求的子孙
 	for(int i=0;i<nd[x].child.size();i++){
  		int u=nd[x].child[i];
  		if(Matched(str,u)) f.insert(u);//匹配到了就放入下一级查询的根节点集合
  		search(f,str,u);
 	}
}

void solve(){
 	string str;
 	getline(cin,str);
 	int s=0;
 	int t=str.find(" ",s);
 	set<int> f[80];//f记录每一级符合要求的节点
 	int i=0;
 	f[0].insert(0);//0级为设为0,设为1的话会影响第一行的查询
 	nd[0].child.push_back(1);//0节点的孩子为1
 	while(t!=string::npos){
  		string temp=str.substr(s,t-s);
  		if(temp[0]!='#')
   			transform(temp.begin(),temp.end(),temp.begin(),::tolower);//转换为小写
  		for(set<int>::iterator it=f[i].begin();it!=f[i].end();it++)//从上一级找到的结果开始dfs查询
   			search(f[i+1],temp,*it);
  		i++;
  		s=t+1;
  		t=str.find(" ",s);
 	}
 	string temp=str.substr(s,str.size()-s);//最后一级
 	if(temp[0]!='#')
  		transform(temp.begin(),temp.end(),temp.begin(),::tolower);
 	for(set<int>::iterator it=f[i].begin();it!=f[i].end();it++)
  		search(f[i+1],temp,*it);
 	i++;
 	cout<<f[i].size();
 	for(set<int>::iterator it=f[i].begin();it!=f[i].end();it++)
  		cout<<" "<<*it;
 	cout<<endl;
}

int main(){
 	cin>>n>>m;
 	cin.get();
 	for(int i=1;i<=n;i++) get_text(i);
 	for(int i=0;i<m;i++) solve();
 	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CCF CSP认证201809-3 元素选择器 的相关文章

随机推荐

  • 初识Nginx和环境准备

    初识Nginx和环境准备 Nginx的优点Nginx的环境搭建开始搭建Nginx环境 Nginx的优点 支持海量的高并发 xff1a 采用IO多路复用epoll 官方测试Nginx能够支持5万并发链接 xff0c 实际生产环境中可以支撑2
  • vim的vimrc配置

    windows 34 modified by Neoh set helplang 61 cn 34 使用中文帮助文档 set encoding 61 utf 8 34 查看utf 8格式的帮助文档 set fileencodings 61
  • C++线程同步——阻塞线程的方法

    一般 xff0c 使线程阻塞我们可以使用 while condition for condition 等循环条件使之线程内语句执行在循环处无法向下继续执行 xff0c 但这样并不是真正意义上的线程阻塞 xff0c 当前线程仍然在执行 xff
  • 利用爬虫爬取游戏网站图片和信息并生成词云图

    一 项目简介 1 1 本项目博客地址 xff1a 1 2 项目完成的功能与特色 功能 xff1a 爬取目标游戏网站的皮肤图片及信息并用爬取的信息生成词云图 特色 xff1a 将爬取的信息做简单的处理 xff0c 并将爬取的图片直接保存在文件
  • Debian搭建FTP服务器及Caddy网站并上传

    Debian搭建FTP服务器及Caddy网站并上传 安装配置FTP1 安装2 查看网络服务状态3 配置vsftpd 安装配置Caddy1 安装Caddy2 配置Caddy 上传网站到服务器疑难解决 参考 安装配置FTP 首先用SSH方式连接
  • linux 软件安装

    linux 软件安装 yum xff1a 软件包管理工具 命令格式 xff1a yum options command command 列表 List of Commands check 检查 RPM 数据库问题 check update
  • POJ2823 滑动窗口 (单调队列)

    题目 来学习一下单调队列 xff1a 他只可以从队尾入队 xff0c 但可以从队尾或队首出队 xff0c 来维护队列的单调性 单调队列有两种单调性 xff1a 元素的值单调和元素的下标单调 单调队列可以用来优化DP 状态转移方程形如dp i
  • docker swarm 使用说明

    docker swarm 使用说明 swarm 命令 xff1a 管理集群 docker swarm command root 64 centos docker swarm help Usage docker swarm COMMAND M
  • SQL处理json数据

    通过sql语句提取json字符串中的数据 1 示例数据 CREATE TABLE 96 json test 96 96 id 96 int NOT NULL COMMENT 39 主键ID 39 96 json str 96 longtex
  • 【一步到位】sublime 配置C/C++环境

    sublime 配置C 43 43 环境 1 找到MinGW64 bin路径2 配置环境变量3 sublime新建Build System4 运行 1 找到MinGW64 bin路径 复制完整路径 2 配置环境变量 xff08 1 xff0
  • docker mysql8使用SSL及使用openssl生成自定义证书

    docker安装MySQL8 修改my cnf vi span class token operator span docker data mysql conf my span class token punctuation span cn
  • springboot连接MySQL使用SSL证书

    安装java jdk 检查是否已安装JDK yum list installed span class token operator span span class token function grep span span class t
  • HTML(五):图片、超链接

    图片 一 图片标签 日常浏览网页中 xff0c 在一个页面中会有文字 图片 音频等等 xff0c 一般一个页面想要获取更多流量 xff0c 一般通过 图文并茂 这一维度进行挖掘 在HTML中 xff0c 使用img标签来表达显示一张图片 对
  • Maven打包提示dependencies.dependency.systemPath错误

    Maven打包提示dependencies dependency systemPath错误 具体信息如下 xff1a Some problems were encountered span class token keyword while
  • macbook桌面的文件突然消失的解决方案

    macos系统的的桌面文件突然间消失的解决方案 原因 有一天就突然发现我电脑桌面上的文件突然就不见了 xff0c 但是commad 43 空格键唤醒聚焦搜索 xff0c 搜索文件又能够找到我所消失的文件 xff0c 并且如果把原有的文件再一
  • 【cmake】搭配vcpkg的manifest模式实现自动安装第三方库

    cmake搭配vcpkg的manifest模式实现自动安装包 好处 类似于pip的requirements 你只需要指定该项目的依赖库 xff0c 就会自动运行vcpkg为你安装所有的依赖库 并且安装在当前项目build下面 这些第三方库与
  • python安装surprise库总是失败

    python安装surprise库缺乏组件的解决办法 1 背景 xff1a 2 明确问题3 找到资源包4 问题解决5 总结 1 背景 xff1a 在做一个用到django框架做音乐的推荐时 xff0c 由于要用到SVD算法 xff0c 需要
  • 通讯网络

    题面 Description 北极的某区域共有n座村庄 xff0c 每座村庄的坐标用一对整数 x y 表示 为了加强联系 xff0c 决定在村庄之间建立通讯网络 通讯工具可以是无线电收发机 xff0c 也可以是卫星设备 所有的村庄都可以拥有
  • Linux主机密码暴力破解

    一 目的 针对Linux主机SSH协议暴力破解过程以及漏洞原理和修复方式详细介绍 二 漏洞介绍 2 1 漏洞原因 由于主机用户没有设置密码或者设置了linux弱密码 xff0c 且未对主机设置严格的基线加固策略 xff0c 导致恶意攻击者可
  • CCF CSP认证201809-3 元素选择器

    201809 3 元素选择器 题目 思路 多级查询需要用到树形结构 xff0c 详见代码 AC代码如下 span class token macro property span class token directive keyword i