CCF刷题计划——LDAP(交集、并集 how to go)
LDAP
计算机软件能力认证考试系统
不知道为什么,直接给我报一个运行错误,得了0分。但是我在Dev里,VS里面都跑的好好的,奇奇怪怪。如果有大佬路过,请帮小弟看看QWQ。本题学到的:交集set_intersection、并集set_union的使用
这道题按照常规思路来说的话并不复杂,其实就是一个集合的差集、并集、交集的问题。我的思路里,因为最后想要得到关于DN的集合,所以我以属性编号和属性值作为索引(也就是map中的键值),用set存在了DN。map<int, map<int, set<int>>>mp; //属性序号,属性值,id集合
,这样的好处是,如果想得到某一属性下值为val的DN的集合,可以直接来:set<int>target = mp[attr][val];
,然后再对这个集合进行后续的处理会方便很多。通过手写差集、交集、并集,最后也是成功做出来了,在其他编译环境下测试样例也是过的好好的,但是提交的时候运行错误我是真的会谢……
运行错误,but样例过了:
#include <iostream>
#include <string>
#include <set>
#include <algorithm>
#include <map>
using namespace std;
const int M = 502;
const int N = 2502;int n, m;
map<int, map<int, set<int>>>mp; //属性序号,属性值,id集合
set<int>totalId;
bool book[N][M] = { false }; //book[id][attr] id的 attr属性 是否存在//毕竟不是求真的差集,魔改一下也是可以的
set<int>different(set<int>s1, set<int>s2,int attr) //默认s1-s2(s1要大)
{set<int>temp;for (auto it1 = s1.begin(), it2 = s2.begin(); it2 != s2.end();){if ((*it1) < (*it2)){if(book[(*it1)][attr]) //如果这个属性存在temp.insert((*it1)); //不相同,将值插入新的setit1++; //因为是求差集,所以只会出现it1比it2慢的情况,这时让it1加把劲}else {it1++; it2++; //否则两个都并进}}return temp;
}set<int>Same(set<int>s1, set<int>s2)
{set<int>temp;//让s1大if (s1.size() < s2.size()){temp = s1;s1 = s2;s2 = temp;}//遍历s2,看s1有没有temp.clear();for (auto it : s2){if (s1.find(it) != s1.end()) //如果存在temp.insert(it); //s1存在,说明交集上了}return temp;
}set<int>Union(set<int>s1, set<int>s2) //并集
{set<int>temp;//让s1大if (s1.size() < s2.size()){temp = s1;s1 = s2;s2 = s1;}temp = s1;//将s2的元素都添加到s1中for (auto it : s2)temp.insert(it); //s1存在,说明交集上了return temp;
}set<int> baseDeal(string s)
{int attr, val;int pos = 1;while (s[pos] >= '0' && s[pos] <= '9') pos++;attr = stoi(s.substr(0, pos));val = stoi(s.substr(pos + 1));set<int>target = mp[attr][val];if (s[pos] == ':') //断言,找同属性同值的id集合 return target; //就是我们之前存的那些 else //非断言,其实就是求id总集和mp集合中的差集{//set_difference(totalId.begin(), totalId.end(), target.begin(), target.end(), temp.begin());return different(totalId, target,attr);}}set<int> easyDeal(string s)
{//将两个base分离string b1, b2;int pos=2;while (s[pos]!=')') pos++; //找到括号b1 = s.substr(2, pos - 2); //第一个num:numint tpos = pos + 2; //定位到第一个数字,记录下来pos++;while (s[pos] != ')') pos++;b2 = s.substr(tpos, pos - tpos);set<int>temp1 = baseDeal(b1);set<int>temp2 = baseDeal(b2);if (s[0] == '&') return Same(temp1, temp2);else return Union(temp1, temp2);
}int main()
{cin >> n;int id, cnt, attr, val; //DN,属性个数,属性序号,属性值 for (int i = 0; i < n; i++){cin >> id >> cnt;totalId.insert(id);while (cnt--){cin >> attr >> val;mp[attr][val].insert(id); //id号attr属性的值是val book[id][attr] = true;}}cin >> m;string str;set<int> ans;while (m--){cin >> str;if (str[0] >= '0' && str[0] <= '9') //BASE_EXPRans = baseDeal(str);else ans = easyDeal(str);for (auto it : ans) cout << it << " ";cout << endl;}return 0;
}
看了题解,发现和我的思路差不多,但是相对而言使用了 set_intersection、set_union 这两个已经写好的函数。所以根本不需要自己写首先并集、交集。
注意,使用set只能过70%,使用unordered_map和vector可以更快,不会超时。
AC:
#include <Iostream>
#include <unordered_map>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;unordered_map<int,unordered_map<int,set<int>>>mp; // <属性序号,<属性值,DN集合>>
unordered_map<int,set<int>>book;int n,m; vector<int> baseDeal(string s)
{int attr=0, val=0;int i,j;for(i=0;isdigit(s[i]);i++) attr=attr*10+s[i]-'0';//属性编号for(j=i+1;j<s.size();j++) val=val*10+s[j]-'0';//属性vector<int> temp;if (s[i] == ':') //断言,找同属性同值的id集合{for(auto it:mp[attr][val]) //就是我们之前存的那些temp.push_back(it); }else //非断言,其实就是求id总集和mp集合中的差集{for(auto it:book[attr]) //遍历存在这个属性的所有DNif(!mp[attr][val].count(it)) //如果不存在,那就加进去temp.push_back(it);return temp;}
}vector<int> solve(string str)
{if(str[0]!='&'&&str[0]!='|') return baseDeal(str);//基本表达式//走到这里的都是复合表达式vector<int> ans,ans1,ans2;int p=2;for(int num=1;num;p++){//根据括号数量获得两个表达式if(str[p]==')') num--;if(str[p]=='(') num++;}ans1=solve(str.substr(2,p-3));ans2=solve(str.substr(p+1,str.size()-p-2));if(str[0]=='&') //交集set_intersection(ans1.begin(),ans1.end(),ans2.begin(),ans2.end(),inserter(ans,ans.begin()));else //并集set_union(ans1.begin(),ans1.end(),ans2.begin(),ans2.end(),inserter(ans,ans.begin()));return ans;
}int main()
{cin>>n;int id, cnt, attr, val; //DN,属性个数,属性序号,属性值 for (int i = 0; i < n; i++){cin >> id >> cnt;while (cnt--){cin >> attr >> val;mp[attr][val].insert(id); //attr 属性 值为val 的有 这些id book[attr].insert(id); //标记这些属性在这些id中存在 }}cin>>m;while(m--) {string s; cin>>s;vector<int> ans=solve(s);for(auto it:ans) cout<<it<<" ";cout<<endl;}return 0;}
参考代码:【CCF-CSP】 202303-3 LDAP_csp ldap-CSDN博客
相关文章:
CCF刷题计划——LDAP(交集、并集 how to go)
LDAP 计算机软件能力认证考试系统 不知道为什么,直接给我报一个运行错误,得了0分。但是我在Dev里,VS里面都跑的好好的,奇奇怪怪。如果有大佬路过,请帮小弟看看QWQ。本题学到的:交集set_intersection、并集…...

谷歌论文提前揭示o1模型原理:AI大模型竞争或转向硬件
Open AI最强模型o1的护城河已经没有了?仅在OpenAI发布最新推理模型o1几日之后,海外社交平台 Reddit 上有网友发帖称谷歌Deepmind在 8 月发表的一篇论文内容与o1模型原理几乎一致,OpenAI的护城河不复存在。 谷歌DeepMind团队于今年8月6日发布…...

【ShuQiHere】 探索数据挖掘的世界:从概念到应用
🌐 【ShuQiHere】 数据挖掘(Data Mining, DM) 是一种从大型数据集中提取有用信息的技术,无论是在商业分析、金融预测,还是医学研究中,数据挖掘都扮演着至关重要的角色。本文将带您深入了解数据挖掘的核心概…...

LabVIEW提高开发效率技巧----使用事件结构优化用户界面响应
事件结构(Event Structure) 是 LabVIEW 中用于处理用户界面事件的强大工具。通过事件驱动的编程方式,程序可以在用户操作时动态执行特定代码,而不是通过轮询(Polling)的方式不断检查界面控件状态。这种方式…...
【前端】ES6:Set与Map
文章目录 1 Set结构1.1 初识Set1.2 实例的属性和方法1.3 遍历1.4 复杂数据结构去重 2 Map结构2.1 初识Map2.2 实例的属性和方法2.3 遍历 1 Set结构 它类似于数组,但成员的值都是唯一的,没有重复的值。 1.1 初识Set let s1 new Set([1, 2, 3, 2, 3]) …...
Java 之网络编程小案例
1. 多发多收 描述: 编写一个简单的聊天程序,客户端可以向服务器发送多条消息,服务器可以接收所有消息并回复。 代码示例: 服务器端 (Server.java): import java.io.*; import java.net.*; import java.util.concurrent.Execut…...
Spring Boot:现代化Java应用开发的艺术
目录 什么是Spring Boot? 为什么选择Spring Boot? Spring Boot的核心概念 详细步骤:创建一个Spring Boot应用 步骤1:使用Spring Initializr创建项目 步骤2:解压并导入项目 步骤3:构建和配置项目 po…...
Redis五种基本数据结构的使用
Redis具有五种基本数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、SortedSet(有序集合),下面示意它们的使用。 String类数据类型的使用 增:添加数据(set)、添加多个数据(mset)、添加数据时指定过期时间(setex) 删…...

【QT】系统-下
欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:QT 目录 👉🏻QTheadrun() 👉🏻QMutex👉🏻QWaitCondition👉🏻Q…...
java和kotlin 可以同时运行吗
Java 和 Kotlin 可以同时运行在同一个项目中,这主要得益于 Kotlin 对 Java 的互操作性。Kotlin 被设计为与 Java 100% 兼容,这意味着 Kotlin 代码可以很容易地调用 Java 代码,反之亦然。这种设计使得 Kotlin 能够无缝集成到现有的 Java 项目中…...

2024最新版 Tuxera NTFS for Mac 2023绿色版图文安装教程
在数字化时代,数据的存储和传输变得至关重要。Mac用户经常需要在Windows NTFS格式的移动硬盘上进行读写操作,然而,由于MacOS系统默认不支持NTFS的写操作,这就需要我们寻找一款高效的读写软件。Tuxera NTFS for Mac 2023便是其中…...
npm发布插件超级简单版
在开源的世界里,每个人都有机会成为贡献者,甚至是创新的引领者。您是否有过这样的想法:开发一个解决特定问题的小工具,让他成为其他开发者手中的利器?今天,我们就来一场实战训练,学习如何将你的…...

C# 访问Access存取图片
图片存入ole字段,看有的代码是获取图片的字节数组转换为base64字符串,存入数据库;显示图片是把base64字符串转换为字节数组再显示;直接存字节数组可能还好一点; 插入的时候用带参数的sql写法比较好;用拼接…...
正则表达式中常见字符的用法介绍
正则表达式(Regular Expression,简称Regex)是一种文本模式描述的方法,包括普通字符(如a到z之间的字母)和特殊字符(称为“元字符”)。正则表达式使用单个字符串来描述、匹配一系列符合…...

Vue3.0组合式API:依赖注入provide和inject实现跨层组件的通信
Vue3.0组合式API系列文章: 《Vue3.0组合式API:setup()函数》 《Vue3.0组合式API:使用reactive()、ref()创建响应式代理对象》 《Vue3.0组合式API:computed计算属性、watch监听器、watchEffect高级监听器》 《Vue3.0组合式API&…...
VSCode中配置C/C++环境
在Visual Studio Code(VSCode)中配置C/C环境是一个相对直接且功能强大的过程,它能让开发者利用VSCode的诸多便利功能来编写、编译和调试C/C代码。以下是一个详细的步骤指南,涵盖了从安装必要的软件到配置编译器、调试器以及VSCode…...

vue实现鼠标滚轮控制页面横向滑动
先看效果 20240919_095531 1.首先创建一个xScroll.vue组件 <template><div class"main" v-size-ob"mainSize"><div class"v-scroll"><div class"content"><slot></slot></div></div>…...

【Git使用】删除Github仓库中的指定文件/文件夹
前言: 上篇文章带大家上传了第一个项目至github,那要是想删除仓库中的指定文件夹怎么办?在Github中 仓库是无法通过鼠标操作直接删除文件和文件夹的,那只能通过 git 命令来执行删除操作。接下来就带大家进行操作。 详细步骤: 一…...
Iptables命令常用命令
前言:下是一些非常实用的 iptables 命令合集,涵盖网络攻击防护和日常网络安全防护 1. 查看当前规则 iptables -L -v -n查看现有的所有规则,-v 显示详细信息,-n 禁止解析IP地址和端口以加快显示速度。 2. 清空所有规则 iptables -F清除所有已…...

前端开发之原型模式
介绍 原型模式本质就是借用一个已有的实例做原型,在这原型基础上快速复制出一个和原型一样的一个对象。 class CloneDemo {name clone democlone(): CloneDemo {return new CloneDemo()} } 原型原型链 函数(class)都有显示原型 prototyp…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...