201809-3 CCF 元素选择器 满分题解(超详细注释代码) + 解题思路(超详细)
问题描述
解题思路
根据题意可以知道在查询中可以分为两种情况
第一种是查询一个标签选择器或者id选择器(可以称为一级查询)
第二种就是存在大于两级的查询(可以称为多级查询)
显然第一种查询需要存储每一种元素在内容中所有出现的行,对应的数据结构可以是unordered_map< string, vector < int > >
对于第二种多级查询,例如查询所有满足 A B C D的位置
首先将所有D出现的位置找出来,也就是上面那个map中存的vector数组
遍历这个数组,相当于遍历每一条以D结尾的路径
对于每一条以D结尾的路径,从D开始回溯,每次回溯到当前行的父亲行(这里需要一个p数组记录父亲行的位置),并且如果路径中的该行中有元素与查询的最后一个元素匹配(这个匹配需要map来记录每一行有哪些元素,对应的数据结构可以是unordered_map < int, unordered_map < string, int > >),则查询元素弹出
当以D结尾的路径遍历完时,并且查询中的元素也为空,则说明这条路径能够满足查询,则将这个答案保存下来
至于p数组中的值,就是利用一个数组记录每一行之前最近的起始行就可以得到,具体可见代码,不难理解
至于两个map中的值,主要是利用双指针还有substr等函数,具体可见代码,不难理解
代码实现
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <unordered_map>using namespace std;
const int N = 110;vector <string> text;
int n, m;
int p[N];
unordered_map <string, vector <int>> val; //存储每一个元素对应的行号
vector<vector <string>> query; //存储所有的查询
unordered_map <int, unordered_map<string, int>> value; //存储每一行有哪些元素,相当于一个可哈希的二维数组//将每一行的父亲行存入p数组,并且去除每一行前面的.
void workparent()
{//先将每一行开头的点数存储在p数组中,并去除.for (int i = 1; i <= n; i ++){string str = text[i];int j = 0;while (j < str.size() && str[j] == '.') j ++; //j停在第一个不是.的位置text[i] = str.substr(j); //去除前面的点p[i] = j; //保存第i行内容前面.的个数}//从头遍历p数组,更新p数组,将p数组存储第i行的父亲行,用t数组存储最近的有p[i] - 2个.的位置int t[N];memset(t, 0, sizeof(t));for (int i = 1; i <= n; i ++){t[p[i]] = i; //更新最近的一个有p[i]个点的位置if (p[i] == 0) continue;int f = t[p[i] - 2]; //父亲节点是最近的有p[i] - 2个点的位置p[i] = f; //存储第i行元素的父节点行数}
}//将每一行询问根据空格分隔存储
void workquery()
{for (int i = n + 1; i <= n + m; i ++) //读入的询问行{string str = text[i];vector <string> r;for (int j = 0; j < str.size(); j ++){int k = j;string t;while (k < str.size() && str[k] != ' ') t += str[k ++]; //k越界或k是空格if (t[0] != '#') transform(t.begin(), t.end(), t.begin(), ::tolower); //可以转包含数字的串!r.push_back(t); //将每一个元素存入rj = k;}query.push_back(r);}
}//存储每一行元素的对应行数
//存储每一行对应有哪些元素
void workpos()
{for (int i = 1; i <= n; i ++){string str = text[i];for (int j = 0; j < str.size(); j ++){int k = j;string t;while (k < str.size() && str[k] != ' ') t += str[k ++]; //k越界或k是空格if (t[0] != '#') transform(t.begin(), t.end(), t.begin(), ::tolower);val[t].push_back(i); //存储t元素的对应行数ivalue[i][t] = 1;//存储i行有元素tj = k;}}
}int main()
{cin >> n >> m;getchar();text.push_back("*"); //使下标从1开始for (int i = 0; i < n + m; i ++) //读入所有内容包括询问{string str;getline(cin, str);text.push_back(str); //1 ~n, n + 1 ~n + m}workparent(); //找到所有行的父亲行workpos(); //存储每一行元素对应的行数workquery(); //将询问处理并分隔//进行询问的查询for (int i = 0; i < query.size(); i ++){vector <string> q = query[i];vector <int> r = val[q.back()]; //r包含最后一个元素出现的所有位置if (q.size() == 1) //一代{cout << r.size(); //是0的话就不会输出!for (auto x : r) cout << " " << x;}else //多代{vector <int> res;for (auto pathend : r) //遍历每一条路{vector <string> flag = q; //标记数组存储的是一行查询的元素,如果路径上出现数组中的末尾元素,就将末尾元素弹出for (int row = pathend; row != 0 && !flag.empty(); row = p[row]) //结束条件,标记数组空了或者路走到了尽头{if (value[row][flag.back()]) flag.pop_back();}if (flag.empty()) res.push_back(pathend); //表明以pathend结尾的路径上能满足该行询问,将这个元素位置加入答案中}cout << res.size();for (auto x : res) cout << " " << x;}cout << endl;}return 0;
}
相关文章:

201809-3 CCF 元素选择器 满分题解(超详细注释代码) + 解题思路(超详细)
问题描述 解题思路 根据题意可以知道在查询中可以分为两种情况 第一种是查询一个标签选择器或者id选择器(可以称为一级查询) 第二种就是存在大于两级的查询(可以称为多级查询) 显然第一种查询需要存储每一种元素在内容中所有出现…...
证书拓展域(1)
证书拓展定义了数字证书的标准拓展,每个拓展域GB/T 16264.8-200X中定义的一个OID相关。 这些OID都是id-ce的成员,其定义如下: id-ce OBJECT IDENTIFIER :: { joint-iso-ccitt(2) ds(5) 29 }1.证书策略 certificatePolicies 1.1 定义 本…...

浅谈ChatGPT 和 对AI 的思考
新世纪以来,人工智能作为一个非常热门话题,一直收到大众的广泛的关注。从一开始的图像的分类,检测,到人脸的识别,到视频分析分类,到事件的监测,到基于图片的文本生成,到AI自动写小说…...

NCRE计算机等级考试Python真题(十二)
第十二套试题1、以下关于程序设计语言的描述,错误的选项是:A.Python语言是一种脚本编程语言B.汇编语言是直接操作计算机硬件的编程语言C.程序设计语言经历了机器语言、汇编语言、脚本语言三个阶段D.编译和解释的区别是一次性翻译程序还是每次执行时都要翻…...

Java并发类库提供的线程池有哪几种? 分别有什么特点?
第21讲 | Java并发类库提供的线程池有哪几种? 分别有什么特点? 我在专栏第 17 讲中介绍过线程是不能够重复启动的,创建或销毁线程存在一定的开销,所以利用线程池技术来提高系统资源利用效率,并简化线程管理,…...

企业微信如何群发消息到客户群?
为提升工作效率,工作中,企业常常会借助企业微信的群发功能一键发送多个客户。那么企业微信如何群发消息呢? 其中成员个人支持群发消息到客户群,企业也可以创建内容提醒成员进行执行群发。 管理员支持在管理端或在手机端创建企业…...

【信号与系统笔记】第一章 绪论
1.1信号传输系统 信息传输的任务 将带有信息的信号,通过某种系统由发送者传送给接收者。 通信系统的组成 转换器:把消息转换为电信号或者把电信号还原成消息信道:信号传输的通道,广义上来说。发射机和接收机也可以是信道的一部分…...

[神经网络]DETR目标检测网络
一、概述 相较于传统目标检测,DETR是一种纯端到端的网络。它不再需要NMS(非极大值抑制,用于去除多余的预测框)和生成anchor。 DETR提出了一个新的目标函数(二分图匹配),这个函数可以强制网络输出一个独一无二的预测值&…...
【服务器管理】connection refused问题解决
简述 在配置服务器的时候,遇到了这个问题。我当时明明已经搭建好了服务,但是我在客户端比如手机上,却怎么都连不上服务器。看日志的话显示的是connection refuesed timeout 这种情况,大概率是服务器的端口没有被打开。 我们只需…...
2023_华为OD机试真题_Python_047_整理扑克牌
整理扑克牌 题目描述 给定一组数字,表示扑克牌的牌面数字,忽略扑克牌的花色,请按如下规则对这一组扑克牌进行整理: 步骤1. 对扑克牌进行分组,形成组合牌,规则如下: 当牌面数字相同张数大于等于4时,组合牌为“炸弹”;3张相同牌面数字 + 2张相同牌面数字,且3张牌与2…...

吐血整理,自动化测试pytest测试框架,资深测试带你少走弯路......
目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 Pytest框架详解 py…...
SAP BASE64加密及解密
简介:BASE64是一种编码方法,它是一种基于用64个可打印字符来表示二进制数据的表示方法,主要应用于数据存储,传输,打印它是用64个可打印字符表示二进制所有数据方法。由于2的6次方等于64,所以可以用每6个位元…...

【页面无响应】Web页面经常无响应前端如何定位与优化(已解決)
【写在前面】客户现场应用我们的系统时候,发现用着用着就出现1个页面无响应现象,给客户带来极其不好的体验,尤其是当重要工作汇报演示时,就给我看无响应,浏览器崩溃?这样对产品的发展无疑是致命的伤&#x…...
隐私计算 FATE - 多分类神经网络算法测试
一、说明 本文分享基于 Fate 使用 横向联邦 神经网络算法 对 多分类 的数据进行 模型训练,并使用该模型对数据进行 多分类预测。 二分类算法:是指待预测的 label 标签的取值只有两种;直白来讲就是每个实例的可能类别只有两种 (0 或者 1)…...
Codeforces Round 853 (Div. 2)
Codeforces Round 853 (Div. 2) C. Serval and Toxels Arrays 思路: 求任意两个组合的元素个数。 注意到,其实每个元素都是独立的。他在任意组合的出现情况组成的贡献是可以分开讨论的。我们讨论元素x。假设x在m1个数组中出现了cnt次(一个…...

Ka频段需要更多带宽?
随着全球连接需求的增长,许多卫星通信(satcom)系统日益采用Ka频段,对数据速率的要求也水涨船高。目前,高性能信号链已经能支持数千兆瞬时带宽,一个系统中可能有成百上千个收发器,超高吞吐量数据速率已经成为现实。 另…...
初学pyinstaller打包过程中的一些问题
记录一下使用pyinstaller打包过程中的一些问题: 不安装虚拟环境打包,直接打包,一般不会出现什么问题,但是打包的exe很大,把所有模块和依赖库也一起打包了。 建议使用虚拟环境打包,安装必要的包࿰…...

第七章:Java常用类
第七章:Java常用类 7.1:字符串相关的类 String的特性 String表示是字符串,使用一对""引起来表示。 String声明为final的,不可被继承。 String实现了Serializable、Comparable接口,表示字符是支持序列化和…...

Apk加固后多渠道打包
之前一直使用360加固宝进行apk的加固打包,可以一键加固并打多渠道打包。但是,现在360加固宝收费了,在进行加固,多渠道打包,就得一步一步自己操作了,会很繁琐。所以,本文使用 360加固美团Wallet …...
K8S + ISTIO 金丝雀部署的例子
金丝雀发布(Canary):也是一种发布策略,和国内常说的灰度发布是同一类策略。蓝绿部署是准备两套系统,在两套系统之间进行切换,金丝雀策略是只有一套系统,逐渐替换这套系统。 Istio 提供一种简单的…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...