CCF-CSP26<2022-06>-第1/2/3题

202206-1 归一化处理

题目:202206-1

题目分析:

给出了数学上归一化的数学公式,直接按照要求完成即可。

AC代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{int n;cin >> n;double a[n];double sum = 0;for (int i = 0; i < n; i++){cin >> a[i];sum += a[i];}double average = sum / n;double dtotal = 0;for (int i = 0; i < n; i++){dtotal += (a[i] - average) * (a[i] - average);}dtotal /= n;for (int i = 0; i < n; i++){cout << (a[i] - average) / sqrt(dtotal) << endl;}return 0;
}

202206-2 寻宝!大冒险!

为什么我的第一想法是这个???

题目:202206-2

题目分析:

【再更新】

60分代码:

【再更新】

70分代码:

【再更新】

AC代码:

【再更新】

202206-3 角色授权

题目分析:

在学习了数据库之后,对于这道题会更加熟悉。实际上本题就是模拟了数据库对于用户权限的管理。

这道大模拟题主要就是概念很复杂,不容易快速上手理解。

总结如下:

  • 用户:主体
  • 用户组:用户组里包括很多用户,这些用户有相同的权限
  • 角色:指明了一个用户可以执行的操作
  • 角色关联:一个用户和一个或多个角色之间的关系,角色关联是一个映射<角色,用户/用户组>
  • 待授权行为:包括主体,操作,资源三个部分

判断一个用户能否执行某个操作的过程是:

  1. 检查所有的角色关联的授权对象清单,如果清单中包含该用户的名称,或者该清单中包含该用户所属的某一个用户组的名称,那么选取该角色关联所关联的角色;
  2. 对于所有被选取的角色,判断这些角色是否能对该资源执行该操作,如果所有角色都不能执行该操作,那么不能执行该操作;
  3. 允许执行该操作。

判断一个角色能否对某个资源执行某个操作的过程是:

  1. 检查该角色的操作清单,如果该角色的操作清单中不包含该操作,且该角色的操作清单中也不包含字符串 *,那么不能执行该操作;
  2. 检查该角色的资源种类清单,如果该角色的资源种类清单中不包含该资源的种类,且该角色的资源种类清单中也不包含字符串 *,那么不能执行该操作;
  3. 检查该角色的资源名称清单,如果该角色的资源名称清单中不包含该资源的名称,且该角色的资源名称清单不是空数组,那么不能执行该操作;
  4. 允许执行该操作。

实际上只要从头到尾执行一遍题目的过程并且不遗漏,就可以拿到大部分的分数。

【注意】一定要按照题目要求由用户->角色再判断是否满足操作、资源类型、资源名。不能直接将角色的权限分配向用户。即不要对于用户A,我知道他有角色BCD,就直接把BCD的操作、资源类型、资源名分别求并,存储在角色A下,这样看上去虽然会简单好多,似乎是优化了。但这样不等价于题目的赋值方式。

反例:

用户A被赋予角色BC

角色B:操作abc、资源类型x、资源名y

角色C:操作def、资源类型z、资源名w

现在询问用户A是否可以操作a,资源类型z,资源名y,这是不可以的。

70分代码:

这个就是从头到尾纯模拟题目的意思,包括存储的结构和执行的操作,都是完全按照题目来的。

具体来说:

前面是读入并存储题目信息。

然后对于每一个被查询的用户(外层循环),先遍历角色链接这个结构体,寻找是否有角色的u数组包含这个用户(这个是单层循环),或者g数组包含这个用户所属的用户组(角色链接一重循环,用户组数组一重循环,这里是两重循环)。现在得到所有包含这个用户的角色,把它们放在一个vector里。

最后遍历这个vector,查看这些角色的所有权限,看看有没有执行被询问的操作、资源种类、资源名的权限。

这个方法实现的瓶颈在于外层循环内的两重循环,最坏的情况下,外层循环q,内层循环m*ng,就需要q*m*ng,5000*500*400,这能达到10^9,这已经是超时了,一般10^8对应1s的数量级,这都需要10s了。因此这个方法只能拿70%数据点。

下面是代码(完全由本人完成):

// -*- coding:utf-8 -*-// File    :   202206-3.cpp
// Time    :   2024/03/26
// Author  :   wolf#include <iostream>
#include <vector>
const int N = 501;using namespace std;// 存储角色信息
struct character
{string name;int nv;vector<string> op;int no;vector<string> rtype;int nn;vector<string> rname;
};// 存储角色与用户/用户组的链接
struct character_link
{string cname;struct character ch;vector<string> u;vector<string> g;
};vector<character> c;
vector<character_link> c_link;int main()
{// 关闭同步ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);// 即使关闭同步,该算法还是会超时,这是算法本身的局限int n, m, q;cin >> n >> m >> q;for (int i = 0; i < n; i++){struct character ctemp;cin >> ctemp.name;cin >> ctemp.nv;for (int j = 0; j < ctemp.nv; j++){string temp;cin >> temp;ctemp.op.push_back(temp);}cin >> ctemp.no;for (int j = 0; j < ctemp.no; j++){string temp;cin >> temp;ctemp.rtype.push_back(temp);}cin >> ctemp.nn;for (int j = 0; j < ctemp.nn; j++){string temp;cin >> temp;ctemp.rname.push_back(temp);}c.push_back(ctemp);}for (int i = 0; i < m; i++){struct character_link cltemp;cin >> cltemp.cname;for (unsigned int j = 0; j < c.size(); j++){if (cltemp.cname == c[j].name){cltemp.ch = c[j];}}int ns;cin >> ns;for (int j = 0; j < ns; j++){string ug, ugname;cin >> ug >> ugname;if (ug == "u"){cltemp.u.push_back(ugname);}else if (ug == "g"){cltemp.g.push_back(ugname);}else{cout << "error" << endl;}}c_link.push_back(cltemp);}for (int i = 0; i < q; i++){string query_user;cin >> query_user;int ng;vector<string> query_ugroup;cin >> ng;for (int j = 0; j < ng; j++){string uboxtemp;cin >> uboxtemp;query_ugroup.push_back(uboxtemp);}string query_op, query_rtype, query_rname;cin >> query_op >> query_rtype >> query_rname;// excuteint ans = 0; // default okvector<character> target_c;for (unsigned int j = 0; j < c_link.size(); j++){for (unsigned int k = 0; k < c_link[j].u.size(); k++){if (query_user == c_link[j].u[k]){target_c.push_back(c_link[j].ch);}}for (unsigned int k = 0; k < c_link[j].g.size(); k++){for (unsigned int t = 0; t < query_ugroup.size(); t++){if (query_ugroup[t] == c_link[j].g[k]){target_c.push_back(c_link[j].ch);}}}}for (unsigned int j = 0; j < target_c.size(); j++){character cnow = target_c[j];// cout << cnow.name << endl;int flag1 = false, flag2 = false, flag3 = false; // default nofor (unsigned int k = 0; k < cnow.op.size(); k++){// cout << query_op << " " << cnow.op[k] << endl;if (query_op == cnow.op[k] || cnow.op[k] == "*"){flag1 = true;break;}}if (flag1 == false)continue;for (unsigned int k = 0; k < cnow.rtype.size(); k++){// cout << query_op << " " << cnow.op[k] << endl;if (query_rtype == cnow.rtype[k] || cnow.rtype[k] == "*"){flag2 = true;break;}}if (flag2 == false)continue;if (cnow.rname.size() == 0)flag3 = true;else{for (unsigned int k = 0; k < cnow.rname.size(); k++){if (query_rname == cnow.rname[k]){flag3 = true;break;}}}if (flag3 == false)continue;// successif (flag1 == true && flag2 == true && flag3 == true){ans = 1;break;}}cout << ans << endl;}return 0;
}

AC代码:

基于上述的分析,我们可以发现瓶颈在于从角色链接去回溯用户对应的角色。如果我能从一开始就知道每一个用户对应哪些角色,是不是就能节省很多时间呢?c++真有这么神奇的数据结构。

使用STL库中的<map>,我们做了一些小改动:

建立<角色名称 - 角色本体>映射,在找到角色名称之后,可以使用find()直接对应到角色本体。

使用多元map保存用户,用户组和角色之间的关联关系,同样在拿到用户之后,使用find()就可以找到角色,不需要从角色的视角去遍历,使用多元map是因为对于一个用户键,可能有多个角色与之相对应,即一个用户被赋予了多个角色。

这里能显著提升效率,是因为<algorithm>中的find(),使用树结构查找,时间复杂度是O(logn),显著大于从角色视角去for循环再验证用户/用户组在不在里面,这样是O(n)。

主要发现还是大量运用了STL库的“黑科技”。

【有参考】https://blog.csdn.net/Andy_Xie007/article/details/133800502

// -*- coding:utf-8 -*-// File    :   202206-3.cpp
// Time    :   2024/03/26
// Author  :   wolf#include <algorithm>
#include <iostream>
#include <map>
#include <set>
#include <unordered_set>
#include <vector>
// 有参考https://blog.csdn.net/Andy_Xie007/article/details/133800502
const int N = 501;using namespace std;
struct character
{string name;set<string> op;    // 操作set<string> rtype; // 资源种类set<string> rname; // 资源名称// 使用unordered_set会加快速度:2.984s -> 2.39s// unordered_set<string> op;    / 操作// unordered_set<string> rtype; // 资源种类// unordered_set<string> rname; // 资源名称
};map<string, character> c; // 角色名称 - 角色本体映射
// 使用find进行检索O(n)时间复杂度,比数组快// 判断cnow角色是否有对(query_op,query_rtype,query_rname)的访问权限
// 使用&传递地址而不是参复制,节省大量时间,否则超时
int check(const character &cnow, const string &query_op, const string &query_rtype, const string &query_rname)
{if (cnow.op.count(query_op) == 0 && cnow.op.count("*") == 0)return 0;if (cnow.rtype.count(query_rtype) == 0 && cnow.rtype.count("*") == 0)return 0;if (cnow.rname.count(query_rname) == 0 && !cnow.rname.empty())return 0;return 1;
}int main()
{// 关闭同步ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);// 加了以上三句话,由90->100int n, m, q;cin >> n >> m >> q;for (int i = 0; i < n; i++){struct character ctemp;string temp;int nv, no, nn;cin >> ctemp.name;cin >> nv;for (int j = 0; j < nv; j++){cin >> temp;ctemp.op.insert(temp);}cin >> no;for (int j = 0; j < no; j++){cin >> temp;ctemp.rtype.insert(temp);}cin >> nn;for (int j = 0; j < nn; j++){cin >> temp;ctemp.rname.insert(temp);}c.insert(make_pair(ctemp.name, ctemp));}// 使用多元map保存用户,用户组和角色之间的关联关系,查找会很快multimap<string, string> relative_u; // user - charactermultimap<string, string> relative_g; // group - characterfor (int i = 0; i < m; i++){string cname;cin >> cname;int ns;cin >> ns;for (int j = 0; j < ns; j++){string ug, ugname;cin >> ug >> ugname;if (ug == "u"){relative_u.insert(make_pair(ugname, cname));}else if (ug == "g"){relative_g.insert(make_pair(ugname, cname));}else{cout << "error" << endl;}}}for (int i = 0; i < q; i++){string query_user;cin >> query_user;int ng;cin >> ng;vector<string> query_ugroup;for (int j = 0; j < ng; j++){string uboxtemp;cin >> uboxtemp;query_ugroup.push_back(uboxtemp);}string query_op, query_rtype, query_rname;cin >> query_op >> query_rtype >> query_rname;// excuteint flag = 0;vector<character> target_c;// upair<multimap<string, string>::iterator, multimap<string, string>::iterator> range_u = relative_u.equal_range(query_user);// auto range_u = relative_u.equal_range(query_user);for (auto it = range_u.first; it != range_u.second; it++){if (check(c.find(it->second)->second, query_op, query_rtype, query_rname)){flag = 1;break;}}if (flag == 1){cout << 1 << endl;continue;}// gfor (unsigned int j = 0; j < query_ugroup.size(); j++){pair<multimap<string, string>::iterator, multimap<string, string>::iterator> range_g = relative_g.equal_range(query_ugroup[j]);// auto range_g = relative_g.equal_range(query_ugroup[j]);for (auto it = range_g.first; it != range_g.second; it++){if (check(c.find(it->second)->second, query_op, query_rtype, query_rname)){flag = 1;break;}}if (flag == 1){break;}}if (flag == 1){cout << 1 << endl;continue;}cout << 0 << endl;}return 0;
}

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

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

相关文章

吴恩达:现在做GPT-4智能体,或将提前达到GPT-5效果|钛媒体AGI

斯坦福大学客座教授吴恩达&#xff08;Andrew Ng&#xff09;© 林志佳 美国斯坦福大学教授吴恩达&#xff08;Andrew Ng&#xff09; 人工智能智能体&#xff08;AI Agents&#xff09;似乎将引领 AI 行业新的发展趋势。 近日红杉资本&#xff08;Sequoia&#xff09;在…

全面概述Gitee和GitHub生成/添加SSH公钥

前言 现如今将代码开源已经成为软件开发行业的一种趋势&#xff0c;而现在比较有名的代码托管平台有GItHub、Gitee、Gitlab等相关平台。而我们在使用代码托管平台最为常见的就是如何将自己本地的代码推送到远程托管平台中的仓库中&#xff0c;现如今各大托管平台基本上都提供了…

Mac m1 Flink的HelloWorld

首先在官方下载Downloads | Apache Flink 下载好压缩包后解压&#xff0c;得到Flink文件夹 进入&#xff1a;cd flink-1.19.0 ls 查看里面的文件&#xff1a; 执行启动集群 ./bin/start-cluster.sh 输出显示它已经成功地启动了集群&#xff0c;并且正在启动 standalonesessio…

云计算探索-剖析虚拟化技术

引言 虚拟化技术&#xff0c;作为现代信息技术架构的核心构成元素&#xff0c;以其独特的资源抽象与模拟机制&#xff0c;成功地瓦解了物理硬件与操作系统间的刚性连接&#xff0c;开创了一个资源共享、灵活调配的崭新天地。本文将详细解析虚拟化技术的内涵、发展历程、分类及特…

Kafka 学习之:基于 flask 框架通过具体案例详解生产消费者模型,这一篇文章就够了

文章目录 案例信息介绍后端异步处理请求和后端同步处理请求同步方式异步方式 环境文件目录配置.envrequirements.txt 完整代码ext.pyapp.pykafka_create_user.py 运行方式本地安装 kafka运行 app.py使用 postman 测试建立 http 长连接&#xff0c;等待后端处理结果发送 RAW DAT…

金三银四面试题(九):JVM常见面试题(3)

今天我们继续探讨常见的JVM面试题。这些问题不比之前的问题庞大&#xff0c;多用于面试中JVM部分的热身运动&#xff0c;开胃菜&#xff0c;但是大家已经要认真准备。 你能保证GC 执行吗&#xff1f; 不能&#xff0c;虽然你可以调用System.gc() 或者Runtime.gc()&#xff0c…

【MySQL】DQL-排序查询-语法&排序方式&注意事项&可cv例题语句

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

【Linux】寿司线程池{单例模式之懒汉模式下的线程池}

文章目录 回顾单例模式0.多线程下的单例模式的意义1.什么是单例模式1.0设计模式1.1C单例模式的介绍及原理1.2拷贝构造和赋值重载的处理1.3if (nullptr ptr)&#xff0c;nullptr放在比较运算符的前面?1.4实现单例模式的方式 2.实现懒汉方式的单例模式2.1单线程的单例模式2.2多…

微信小程序(黑马优购:登录)

1.点击结算进行条件判断 user.js //数据 state: () >({ // address: {} address: JSON.parse(uni.getStorageSync(address) || {}), token: }), my-settle.vue computed: { ...mapGetters(m_cart,[checkedCount,total,checkedGoodsAmount]), …

前端工程师————CSS学习

选择器分类 选择器分为基础选择器和复合选择器 基础选择器包括&#xff1a;标签选择器&#xff0c;类选择器&#xff0c;id选择器&#xff0c;通配符选择器标签选择器 类选择器 语法&#xff1a;.类名{属性1&#xff1a; 属性值&#xff1b;} 类名可以随便起 多类名使用方式&am…

从乡间小路到布鲁金斯大道:奥林商学院院长的公路之旅

复旦大学-华盛顿大学EMBA项目&#xff0c;是由复旦大学管理学院与美国华盛顿大学奥林商学院联合开办的EMBA项目。美国华盛顿大学奥林商学院&#xff0c;于去年9月迎来新院长Mike。      今年1月&#xff0c;Mazzeo院长首次到访复旦大学&#xff0c;与校友分享了一场 “经济…

中间件安全(apache、tomcat)

靶场&#xff1a; vulfocus Apache Apache HTTP Server 是美国阿帕奇&#xff08; Apache &#xff09;基金会的一款开源网页服务器。该服务器具有快速、可靠且可通过简单的API进行扩充的特点&#xff0c;发现 Apache HTTP Server 2.4.50 中针对 CVE - 2021 - 41773 的修复…

PHP三种方式读取RSA密钥加解密、签名验签完整教程

目录 第一步、生成公私钥 第二步、三种方式读取RSA密钥 第1种&#xff1a;公私钥弄成一行&#xff0c;必须一行没有空格和换行 第2种&#xff1a;直接复制生成公私钥 第3种;复制密钥存储为.pem文件后缀 第三步、RSA加解密 第四步、RSA签名以及验证签名 第五步、封装完整…

开源知识管理和协作平台:插件丰富,主题精美 | 开源日报 No.209

logseq/logseq Stars: 27.8k License: AGPL-3.0 logseq 是一个注重隐私的开源平台&#xff0c;用于知识管理和协作。 提供强大的知识管理、协作、PDF 标注和任务管理工具支持多种文件格式&#xff0c;包括 Markdown 和 Org-modeWhiteboard 功能可使用空间画布组织想法&#x…

【前端】layui前端框架学习笔记

【前端目录贴】 参考视频:LayUI 参考笔记:https://blog.csdn.net/qq_61313896/category_12432291.html 1.介绍 官网&#xff1a;http://layui.apixx.net/index.html 国人16年开发的框架,拿来即用,门槛低 … 2. LayUi的安装及使用 Layui 是一套开源的 Web UI 组件库&#xff0…

[Python] 如何导出PDF文件中的图片

文章目录 一、背景说明二、代码编写三、问题3.1、如何得到图片的xref&#xff1f;3.2、xref有什么用呢&#xff1f; 四、总结 一、背景说明 最近在看一份pdf的书籍&#xff0c;其中有一些图片绘制地比较出色&#xff0c;所以就打算将其复制出来&#xff0c;以便于在需要的时候…

鸿蒙实战开发-如何使用声明式UI编程框架的基础组件

介绍 在本教程中&#xff0c;我们将通过一个简单的样例&#xff0c;学习如何使用声明式UI编程框架的基础组件。本篇Codelab将会使用Image组件、Slider组件、Text组件共同实现一个可调节的风车动画&#xff0c;实现效果如图所示 相关概念 Text组件&#xff1a;文本组件&#x…

使用虚幻引擎为AR体验提供动力

Powering AR Experiences with Unreal Engine ​​​​​​​ 目录 1. 虚幻引擎概述 2. 虚幻引擎如何为AR体验提供动力 3. 虚幻引擎中AR体验的组成部分是什么&#xff1f; 4. 使用虚幻引擎创建AR体验 5. 虚幻引擎中AR的优化提示 6. 将互动性融入AR与虚幻引擎 7. 在AR中…

故障诊断模型 | 基于LSTM长短期记忆神经网络的滚动轴承故障诊断(Pytorch)

概述 LSTM(Long Short-Term Memory)是一种常用的循环神经网络(RNN),在时间序列数据处理任务中表现优秀,可用于滚动轴承故障诊断。 滚动轴承故障通常会导致振动信号的变化,这些振动信号可以被视为时间序列数据。LSTM能够捕捉时间序列之间的依赖关系,从而对滚动轴承的故…

SQL | SQL 3小时快速入门学习笔记

【【数据库】SQL 3小时快速入门 #数据库教程 #SQL教程 #MySQL教程 #database#Python连接数据库】 课程链接 一、SQL 1.资料库管理系统&#xff08;Database Management System&#xff0c;简称DBMS&#xff09; 是整理资料的软件。其主要功能包括数据的存储、检索、更新和删除…