202303 CSP认证 | LDAP

LDAP
好好好,难度直线上升,是一道又有了字符串处理味道的第三题
第一把写官网40分,acwing TLE且只通过了一道数据…本文是自己这题奋斗过程 的一个记录

先贴个40分的代码:
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;   // key and value pair
int n;unordered_map<int, unordered_map<string, string> > user;  //每个用户对应一个key and value的映射表
unordered_map<string, unordered_set<int> > key_user;  //i作为key, 表示哪些用户具有属性i//处理一个基本表达式,检查基本表达式与dn的用户是否匹配
set<int> base_expr(string expr)
{int i = 0;while(expr[i] != ':' && expr[i] != '~') i ++;string arr = expr.substr(0, i);string value = expr.substr(i + 1, expr.size() - i - 1);set<int> res;unordered_set<int> users = key_user[arr];if(expr[i] == ':'){for(auto x : users){   //遍历每一个用户if(user[x][arr] == value){res.insert(x);}}}else{for(auto x : users){if(user[x][arr] != value){res.insert(x);}}}return res;
}//处理一个常规的表达式
set<int> handle(string expr)
{set<int> ans;//括号要成对取出if(expr[0] == '&' || expr[0] == '|'){stack<char> s; int i = 2;set<int> res1, res2;s.push('(');int cnt = 1;while(!s.empty()){while(expr[i] != '(' && expr[i] != ')') i ++;if(expr[i] == '(') { s.push('('); cnt ++; }  //入栈并进行计数else if(expr[i] == ')') s.pop(); //弹出一个栈顶的i ++;}//此时第一个括号提取完毕string expr1 = expr.substr(2, i - 3);string expr2 = expr.substr(i + 1, expr.size() - i - 2);//cout << "两个表达式分别为:\n" << expr1 <<"\n" << expr2 <<"\n";if(cnt == 1){   //此时是一个简单表达式res1 = base_expr(expr1);res2 = base_expr(expr2);}else{res1 = handle(expr1);res2 = handle(expr2);}if(expr[0] == '&'){  //取两个集合的交集for(auto x : res1){   //遍历一个集合就可以了if(res2.count(x)) ans.insert(x);}}else{   //取两个集合的并集for(auto x : res1) ans.insert(x);for(auto x : res2) ans.insert(x);}}else { //若要处理的输入就是一个基本表达式ans = base_expr(expr);}return ans;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n;for(int i = 0;i < n;i ++){int dn, x;string arr, val;cin >> dn >> x;while(x --){cin >> arr >> val;key_user[arr].insert(dn);  //dn具有属性arruser[dn][arr] = val;  //dn具有属性arr,且value = val}}int m; cin >> m;string line;while(m --){cin >> line;set<int> ans = handle(line);for(auto x : ans){cout << x <<' ';}cout << "\n";}return 0;
}

秉持着自己的逻辑应该没错但是官网是40分错误的判断,我找了几分代码比对着修改了一下,找到了一个逻辑错误。

handle函数中我统计了一个cnt用于控制当括号里面的是基础表达式的时候就直接调用base_expr函数,问题就出在这里。
· 第一个问题:我只统计了第一个括号的层数,我默认这两个括号的层级是一样的。这样会导致错误,也就是当前一个括号里是基本表达式而第二个括号里面并不是的时候,此时base_expr并不能解决这样的表达式
· 第二个问题:这里也不算会直接导致错误的原因。在handle函数中,如果发现不是一个逻辑表达式的话,其实有调用base_expr函数的。因此不用重复写,直接一直迭代向下调用handle函数即可。

修改后代码运行超时,逻辑问题变优化问题了,先放个70分的代码(代码几乎没变,就是handle函数体内部改变)
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;   // key and value pair
int n;unordered_map<int, unordered_map<string, string> > user;  //每个用户对应一个key and value的映射表
unordered_map<string, unordered_set<int> > key_user;  //i作为key, 表示哪些用户具有属性i//处理一个基本表达式,检查基本表达式与dn的用户是否匹配
set<int> base_expr(string expr)
{int i = 0;while(expr[i] != ':' && expr[i] != '~') i ++;string arr = expr.substr(0, i);string value = expr.substr(i + 1, expr.size() - i - 1);set<int> res;unordered_set<int> users = key_user[arr];if(expr[i] == ':'){for(auto x : users){   //遍历每一个用户if(user[x][arr] == value){res.insert(x);}}}else{for(auto x : users){if(user[x][arr] != value){res.insert(x);}}}return res;
}//处理一个常规的表达式
set<int> handle(string expr)
{set<int> ans;//括号要成对取出if(expr[0] == '&' || expr[0] == '|'){stack<char> s; int i = 2;set<int> res1, res2;s.push('(');while(!s.empty()){while(expr[i] != '(' && expr[i] != ')') i ++;if(expr[i] == '(')  s.push('(');    //入栈并进行计数else if(expr[i] == ')') s.pop(); //弹出一个栈顶的i ++;}//此时第一个括号提取完毕string expr1 = expr.substr(2, i - 3);string expr2 = expr.substr(i + 1, expr.size() - i - 2);//cout << "两个表达式分别为:\n" << expr1 <<"\n" << expr2 <<"\n";res1 = handle(expr1);res2 = handle(expr2);if(expr[0] == '&'){  //取两个集合的交集for(auto x : res1){   //遍历一个集合就可以了if(res2.count(x)) ans.insert(x);}}else{   //取两个集合的并集for(auto x : res1) ans.insert(x);for(auto x : res2) ans.insert(x);}}else { //若要处理的输入就是一个基本表达式ans = base_expr(expr);}return ans;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n;for(int i = 0;i < n;i ++){int dn, x;string arr, val;cin >> dn >> x;while(x --){cin >> arr >> val;key_user[arr].insert(dn);  //dn具有属性arruser[dn][arr] = val;  //dn具有属性arr,且value = val}}int m; cin >> m;string line;while(m --){cin >> line;set<int> ans = handle(line);for(auto x : ans){cout << x <<' ';}cout << "\n";}return 0;
}

明天我来看看满分要怎么优化!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/754030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Servlet两种配置

通过xml配置 <servlet><servlet-name>MyServlet</servlet-name><servlet-class>MyServlet</servlet-class> </servlet> <servlet-mapping><servlet-name>MyServlet</servlet-name><url-pattern>/MyServlet</ur…

U盘变本地磁盘?数据恢复有妙招!

一、U盘异变本地磁盘现象 在日常工作和生活中&#xff0c;U盘作为便携式的存储设备&#xff0c;广受大家喜爱。然而&#xff0c;有时我们会遇到一个奇怪的现象&#xff1a;原本应该显示为可移动磁盘的U盘&#xff0c;在插入电脑后却变成了“本地磁盘”。这种情况不仅让人困惑&…

论文解读之Attention-based Deep Multiple Instance Learning

前言 多实例学习是由监督学习演变而来的&#xff0c;我们都知道&#xff0c;监督学习在训练的时候是一个实例&#xff08;或者说一个样本、一条训练数据&#xff09;对应一个确定的标签。而多实例的特点就是&#xff0c;我们在训练的时候的输入是多个实例对应一个确定的标签&a…

JUC之CAS比较并交换

CAS 原子类引入 加入原子整型类的操作后&#xff0c;无锁化的操作 CAS 比较并交换 硬件级别的保证 源码分析 引出UnSafe类 UnSafe源码分析 unsafe中的do-while保证自旋 public final int getAndAddInt(Object var1, long var2, int var4) {int var5;do {var5 this…

JSON基础知识

目录 一、定义二、作用三、特点四、语法JSON具有以下这些形式&#xff1a;4.1 对象(JSONObject)&#xff1a;4.2 数组(JSONArray)&#xff1a;4.3 值4.4 字符串4.5 数值 五、常用的JSON解析方式5.1 org.json解析5.1.1 常用api5.1.2 get方法与opt方法对比5.1.3 使用示例5.1.3 参…

jS 正则

概念 正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript中&#xff0c;正则表达式也是对象。这些模式被用于 RegExp 的 exec 和 test 方法, 以及 String 的 match、matchAll、replace、search 和 split 方法。 创建正则表达式 两种方法&#xff1a;字面量方式、构造…

Spring-3

目录 Spring AOP和AspectJ AOP 在Spring AOP 中&#xff0c;关注点和横切关注的区别 Spring 框架中的单例 Bean 是线程安全的吗 Spring 是怎么解决循环依赖的&#xff1f; 事务隔离级别 事务的传播级别 Spring 事务实现方式 Spring框架的事务管理有哪些优点 事务注解的…

2、高级语言的语法描述

常用的高级程序设计语言 程序语言的定义 语法 一组规则&#xff0c;用它可以形成和产生合适的程序 词法规则&#xff1a;单词符号的形成规则。 单词符号的形成规则单词符号是语言中具有独立意义的最基本结构 一般包括:常数、标识符、基本字、算符、界符等 描述工具:有限自动机…

膨胀 卷积

1.作用 Dilated convolution、Atrous convolution 增大感受野保持原输入大小 2.膨胀因子 描述的是相邻元素之间的距离 r 2 3.gridding effect 不合理的多个膨胀卷积之前&#xff0c;设计的膨胀因子不合理导致&#xff0c;在增大感受野的同时丢失了细节信息。 丢失&…

7.测试教程-自动化测试selenium-2

文章目录 1.webdriver API1.1元素的定位1.2id定位1.3name 定位1.4tag name 定位和class name 定位1.5CSS 定位(常用)1.5.1概念1.5.2实操1.5.3语法 1.6XPath 定位1.6.1概念1.6.2实操1.6.3语法 1.7link text定位1.8Partial link text 定位1.9一个简单的测试实战1.10CSS定位和XPat…

sqllab第二十六A关通关笔记

知识点&#xff1a; 布尔注入 只能爆破出不带空格的语句信息database() version() 等空格、注释都被过滤了错误不回显了 感觉和26关应该差不多 构造payload:id0||11 发现可以绕过 尝试进行错误注入 构造payload:id||exp(710)1 发现页面没有有价值的回显信息&#xff1b;…

一个可商用私有化部署的基于JAVA的chat-gpt网站

目录 介绍一、核心功能1、智能对话2、AI绘画3、知识库4、一键思维导图5、应用广场6、GPTS 二、后台管理功能1、网站自定义2、多账号登录支持3、商品及会员系统4、模型配置5、兑换码生成6、三方商户用户打通 结语 介绍 java语言的私有化部署的商用网站还是比较少的 这里给大家介…

Go语言gin框架中加载html/css/js等静态资源

Gin框架没有内置静态文件服务&#xff0c;但可以使用gin.Static或gin.StaticFS中间件来提供静态文件服务。 效果图如下&#xff1a; 一、gin 框架加载 Html 模板文件的方法 方式1&#xff1a;加载单个或多个html文件&#xff0c;需要指明具体文件名 r.LoadHTMLFiles("vie…

手写简易操作系统(十)--中断概述

前情提要 我们还是总结一下前面做了什么 1、计算机启动&#xff0c;BIOS将MBR导入到内存&#xff0c;并跳转到相应位置执行 2、MBR将Loader导入到内存&#xff0c;并跳转执行 3、Loader中开启保护模式&#xff0c;准备好GDT表&#xff0c;开启内存分页&#xff0c;从此之后…

9成省份“鸿蒙化”,它真起来了?

自去年9月华为宣布鸿蒙原生应用全面启动以来&#xff0c;鸿蒙正以不可阻挡之势&#xff0c;快速在全国千行百业的移动应用领域推进。不仅有支付宝、快手、淘宝、京东等超200家头部互联网企业加入鸿蒙生态&#xff1b;2024年以来&#xff0c;上海、浙江、广西等多省市政务民生、…

C++_day6

思维导图&#xff1a; 2试编程 封装一个动物的基类&#xff0c;类中有私有成员: 姓名&#xff0c;颜色&#xff0c;指针成员年纪 再封装一个狗这样类&#xff0c;共有继承于动物类&#xff0c;自己拓展的私有成员有:指针成员:腿的个数(整型 int count)&#xff0c;共有成员函数…

2024全新红娘交友系统定制版源码 | 相亲交友小程序源码 全开源可二开

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 全新红娘交友系统定制版源码 | 相亲交友小程序源码 全开源可二开 定制版红娘交友平台小程序源码&#xff0c;很牛逼的东西&#xff0c;虽然是小程序&#xff0c;但是有700多M大&…

modbus客户端

通信方式支持 串口 / udp / tcp通信&#xff1b; 设备协议支持RTU / ASCII / TCP&#xff1b; 读取类型支持bool / short / int / float / double / long / batchbool / batchword

JAVA八股day1

遇到的问题 相比于包装类型&#xff08;对象类型&#xff09;&#xff0c; 基本数据类型占用的空间往往非常小为什么说是几乎所有对象实例都存在于堆中呢&#xff1f;静态变量和成员变量、成员变量和局部变量的区别为什么浮点数运算的时候会有精度丢失的风险&#xff1f;如何解…