CCF刷题计划——LDAP(交集、并集 how to go)

ops/2024/9/19 17:07:50/ 标签: ccf, c++, 算法, stl

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博客


http://www.ppmy.cn/ops/113075.html

相关文章

鸿蒙开发(NEXT/API 12)【使用head发送网络请求 (C/C++)】远场通信服务

场景介绍 发送一个带有默认HTTP参数的HTTP HEAD请求&#xff0c;并返回来自服务器的HTTP响应。使用异步回调。类似GET请求&#xff0c;但只返回相应头&#xff0c;不返回实体内容。可以获取资源的元信息&#xff0c;如文件大小、修改日期等。 使用示例 CPP侧导入模块。 #incl…

Android 15 正式发布至 AOSP

Google官方宣布&#xff0c;将于近期发布了 Android 15&#xff0c;而在早些时候&#xff0c;Google已经将其源代码推送至 Android 开源项目 (AOSP)。未来几周内&#xff0c;Android 15 将在受支持的 Pixel 设备上正式推出&#xff0c;并将于今年晚些时候在三星、Honor、iQOO、…

JAVA8引入了哪些新特性

‌Java 8引入了多项新特性&#xff0c;使得编写代码更加简洁、易于维护和功能更强大。‌ 这些新特性主要包括&#xff1a; 1‌、Lambda表达式‌&#xff1a;Lambda表达式是Java 8最重要的特性之一 它提供了一种简洁的方式来表示匿名函数。Lambda表达式的语法为(parameters) -&…

使用C++进行机器学习开发

在机器学习的开发过程中&#xff0c;Python 是最广泛使用的编程语言&#xff0c;主要原因是其庞大的库生态和简便的语法。然而&#xff0c;C作为一种高性能语言&#xff0c;在某些性能要求极高或资源受限的场景下也具有非常重要的地位。C的高效性和对底层硬件的控制能力&#x…

MySQL行转列

在数据库操作中&#xff0c;有时我们需要将行数据转换为列数据&#xff0c;这在生成报表或进行数据汇总时尤为常见。本文将以一个学生成绩表为例&#xff0c;演示在MySQL中实现行转列的几种方法。 示例数据 假设我们有一个学生成绩表 score&#xff0c;包含以下三列&#xff…

超链接/表格/表单的复习(课后作业)

1.作业1 提示&#xff1a; 标题在title中修改 百度logo是图片链接(img) 新闻&#xff0c;贴吧是超链接&#xff0c;直接上官网cv 还有文本呢输入框 完成前端HTML代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&q…

【算法篇】哈希类(笔记)

目录 一、常见的三种哈希结构 二、LeetCode 练习 1. 有效的字母异位词 2. 两个数组的交集 3. 快乐数 4. 两数之和 5. 四数相加II 6. 赎金信 7. 三数之和 8. 四数之和 一、常见的三种哈希结构 当想使用哈希法来解决问题的时候&#xff0c;一般会选择如下三种数据…

TS axios封装

方式一 service/request/request.ts import axios from axios import { ElLoading } from element-plus import type { AxiosRequestConfig, AxiosInstance, AxiosResponse } from axios import type { ILoadingInstance } from element-plus/lib/el-loading/src/loading.typ…

jeesite支持db2数据库初始化sql

点击下载&#xff1a;jeesite5.8.1-db2-sql.rar 提取码: yqev

Rasa对话模型——做一个语言助手

1、Rasa模型 1.1 模型介绍 Rasa是一个用于构建对话 AI 的开源框架&#xff0c;主要用于开发聊天机器人和语音助手。Rasa 提供了自然语言理解&#xff08;NLU&#xff09;和对话管理&#xff08;DM&#xff09;功能&#xff0c;使开发者能够创建智能、交互式的对话系统。 1.2…

MindShare PCIE 3.0 笔记-第一二章

MindShare 官网&#xff0c;地址如下: MindShare Chapter 1&#xff1a;PCIE 背景介绍 - PCI 总线模型 1. 以 PCI 总线作为外设总线的 SOC 芯片架构 下图展示了一个以 PCI 总线作为外设总线的 SOC 芯片架构(PCI 总线类似 AXI 下的 AHB&#xff1f;)&#xff1a; 由上图可知…

RK3568平台(音频篇)Tinyalsa open调用流程

一.TinyALSA 简介 TinyALSA 是一个轻量级的 ALSA(Advanced Linux Sound Architecture,高级 Linux 音频架构)实现,用于与 Linux 内核中的 ALSA(高级 Linux 声音架构)进行交互,旨在为嵌入式系统和资源受限的设备提供音频支持。 ALSA是位于Linux Kernel层面的音频系统。T…

MySQL 数据库中常用的SQL函数

一、字符串函数 #concat Select concat (hello,world); ​ #lower Select lower (HELLO); ​ #upper Select upper (hello); ​ #lpad Select lpad (wang,8,--); ​ #trim Select trim(helloworld); 二、数值函数 #ceil Select ceil(1.1); ​ #floor Select floor(1.8); ​ #…

C#迭代器方法和yield用法

一.迭代器方法介绍 可使用foreach循环进行遍历的方法&#xff0c;称为迭代器方法。 迭代器方法使用yield return语句返回元素。 到达yield return语句时&#xff0c;会记住当前在代码中的位置。 下次调用迭代器函数时&#xff0c;将从该位置开始执行。换言之&#xff0c;如果…

Oracle SQL injection(SQL注入)

Oracle SQL注入是一种网络安全漏洞&#xff0c;它允许攻击者在Oracle数据库驱动的Web应用程序中插入或“注入”恶意的SQL代码。这种攻击通常发生在应用程序未能正确验证或清理用户输入的数据时&#xff0c;从而允许攻击者操纵数据库查询&#xff0c;进而获取、修改或删除敏感信…

xml中SQL执行错误(使用另外一张表的两个字段,组装SQL的where查询条件)

SQL实现功能描述&#xff1a;根据系统设置中的商店到期提醒周期、单位&#xff0c;在过期提醒的列表中&#xff0c;对数据进行周期展示 错误复现&#xff1a; Mapper接口中抽象方法的定义如下&#xff1a; Page<ShopVo> queryList(Param(“vo”) ShopVo shopVo ,Page&…

下载github patch到本地

以下是几种从 GitHub 上下载以.patch 结尾的补丁文件的方法&#xff1a; 通过浏览器直接下载 打开包含该.patch 文件的 GitHub 仓库。在仓库的文件列表中找到对应的.patch 文件。点击该文件&#xff0c;浏览器会显示文件的内容&#xff0c;在页面的右上角通常会有一个“Raw”…

抓机遇,促发展——2025第十二届广州国际汽车零部件加工技术及汽车模具展览会

新能源时代&#xff0c;电动化、智能化正在重塑全球汽车市场格局。中国自主品牌新能源汽车的市占率不断提升、头部效应初显&#xff0c;更有机会带动相关供应链企业成长。中国的零部件企业有望抓住变局下的机会&#xff0c;在新一轮竞争中崛起。 智能电动车时代&#xff0c;汽车…

openssl 生成多域名 多IP 的数字证书

openssl.cnf 文件内容&#xff1a; [req] default_bits 2048 distinguished_name req_distinguished_name copy_extensions copy req_extensions req_ext x509_extensions v3_req prompt no [req_distinguished_name] countryName CN stateOrProvinceName GuangDong l…

k8s中的lables和matchlables的作用

statefulset中的labels和matchlables labels 是一种键值对&#xff0c;可以被附加到任何 Kubernetes 资源&#xff08;如 Pods、Services、ConfigMaps 等&#xff09;&#xff0c;用于为资源添加元数据。你可以使用 labels 对资源进行分组或标识&#xff0c;以方便管理和查询。…