使用C++的CCF-CSP满分解决方案 202206-3 角色授权

CCF-CSP 202206-3 角色授权 C++满分题解 c++满分解ccf-csp真题202206-3 角色授权 阅读详情

题目过长,就不贴了……

解题思路

反复阅读题目,会发现其实用户和用户组是一回事,二者是并列的关系,而不是包含的关系,所以没必要把二者区分。
每个角色用名称标识,再加上三个集合存储信息,然后就没什么难的了。

注意事项

在写的时候遇到了如下问题:

  • 运行时间过长:
    在这里插入图片描述

解决方法是加上一句话就好:

//提高cin,cout的速度 
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);

  • 注意理解题意:
    我最开始以为是所有的权限共享,后来写错之后发现,原来是只能用一个角色来过三个关卡的。

满分代码实现:

#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <set>
using namespace std;

/*
class Client {
public:
	string name;
	string kind;
	
	Client(const string& name, const string& kind) : name(name), kind(kind) {}
}; 
*/

class Role {
public:
	string name;
	set<string> operation;
	set<string> sourceKind;
	set<string> sourceName;
	
	Role(string name, set<string> operation, set<string> sourceKind,
	set<string> sourceName) : name(name), operation(operation), sourceKind(sourceKind),
	sourceName(sourceName) {}
	
    bool operator<(const Role &other) const {
        return name <= other.name;
	}	
};

/*
class Connect {
public:
	map<string, Role> _map;
};
*/

class Solve {
private:
	unordered_map<string, Role> roles;
	unordered_map<string, vector<string> > connect;
	void getRole(int n);
	void getConnect(int m);
	void judgePrint();
	bool judge(const vector<string>& names);
public:
	void solve();
};

inline void Solve::getRole(int n) {
	string name;
	set<string> operation;
	set<string> sourceKind;
	set<string> sourceName;
	string tmp;
	int a = 0;
	for (int i = 0; i < n; i++) {
		operation.clear();
		sourceKind.clear();
		sourceName.clear();
		cin >> name;
		cin >> a;
		for (int j = 0; j < a; j++) {
			cin >> tmp;
			operation.insert(tmp);
		}
		cin >> a;
		for (int j = 0; j < a; j++) {
			cin >> tmp;
			sourceKind.insert(tmp);
		}
		cin >> a;
		for (int j = 0; j < a; j++) {
			cin >> tmp;
			sourceName.insert(tmp);
		}
		roles.insert(make_pair(name, Role(name, operation, sourceKind, sourceName)));
	}
}

inline void Solve::getConnect(int m) {
	int num = 0;
	string roleName;
	string clientName;
	for (int i = 0; i < m; i++) {
		cin >> roleName;
		cin >> num;
		for (int j = 0; j < num; j++) {
			cin >> clientName;
			cin >> clientName;
			connect[clientName].push_back(roleName);
		}
	}
}

inline void Solve::solve() {
	int n = 0, m = 0, q = 0;
	cin >> n >> m >> q;
	getRole(n); 
	getConnect(m);
	for (int i = 0; i < q; i++) {
		judgePrint();
	}	
}

inline void Solve::judgePrint() {
	string name;
	vector<string> names;
	cin >> name;
	names.push_back(name);
	int num = 0;
	cin >> num;
	for (int i = 0; i < num; i++) {
		cin >> name;
		names.push_back(name);
	}
	if (judge(names)) {
		cout << 1 << endl;
	}
	else {
		cout << 0 << endl;
	}
}
inline bool Solve::judge(const vector<string>& names) {
	string name, oper, kind, sname;
	cin >> oper >> kind >> sname;
	for (string name : names) {
		if (!connect.count(name)) continue;
		const vector<string>& vec = connect[name];
		for (string roleName : vec) {
			const Role& r = roles.at(roleName);
			if (r.operation.count("*") || r.operation.count(oper)) {
				if (r.sourceKind.count("*") || r.sourceKind.count(kind)) {
					if (r.sourceName.empty() || r.sourceName.count(sname)) {
						return true;
					}
				}
			}
		}
	}
	return false;
}

int main() {
	//提高cin,cout的速度 
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	Solve solution;
	solution.solve();
	return 0;
}
【神奇的电报】CSP题目 C++实现 【神奇的电报】有一份神奇的电报,如下: 小张经彻夜研究,发现了规律: 第一行的数字随便是什么,以后每一行都是对上一行“读出来” 比如第 2 行,是对第 1 行的描述,意思是:1 个 1,1 个 3,所以是:1113 第 3 行,意思是:3 个 1,1 个 3,所以是:3113 请你编写一个程序,可以从初始数字开始,连续进行这样的变换。 阅读详情

相关推荐

深入Linux内核:PTP硬件时间戳(HW Timestamp)是如何炼成的?

本文深入探讨了Linux内核中PTP硬件时间戳(HW Timestamp)的实现原理与实战应用。通过分析IEEE 1588协议在网络时间同步中的关键作用,详细解析了硬件时间戳在Linux内核中的架构设计、驱动开发及性能优化技巧,帮助开发者实现纳秒级精度的时间同步。

weixin_30727835的博客 650

CCF-CSP202206-3角色授权

【代码】CCF-CSP202206-3角色授权。

ZeroXback的博客 339

Dify安装使用说明

dify可以说是一个功能不错的LLMOps,可以通过dify集中管理模型,可以通过界面创建AI应用,可以上传文档形成知识库,可以创建自定义工具(API),并可以对外提供API。相关功能类似Openai的GPTs或智谱的智能体,其他大厂的大模型也有类似功能,不过貌似只有dify是开源的。这就为个人本地部署AI应用提供了便利。

龙井茶的Sky 1万+

CCF-CSP 26次 第三题【角色授权】

【代码】CCF-CSP 26次 第三题【角色授权】

QZZ_PP的博客 1300

CMap数据库学习及结果可视化

CMap是一个生物信息学数据库和工具,旨在通过比较基因表达谱来揭示药物、基因和疾病之间的潜在关联。CMap数据库主要用于寻找药物、化合物和生物过程之间的关系,并用于药物重定位(drug repurposing)和疾病机制研究。

zfyyzhys的博客 5599

虚拟机扩容——非LVM分区

虚拟机扩容——非LVM分区

ytraister的博客 3905

CCF CSP——202206-3 角色授权

CCF CSP202206-3 角色授权满分攻略

qq_40477864的博客 1702

百度飞桨EasyDL图像分类:收费口车辆类型自动识别

车辆类型识别在高速收费路口的应用中,场景相对单一且拍摄角度一致,因此首次训练模型效果优异,准确率达到了95%,鉴于市面上的车辆类型不断更新迭代且部分车辆的主要特征也不断发生变化,因此可在模型投入应用后,持续收集模型实际运行过中产生的数据,定期添加数据进行模型迭代,保证模型效果。企业将AI模型应用到实际场景中以实现停车费用、过路费用的自动计算,在收费口中由相机对每个车辆进行拍摄,拍摄到的图片传输到预测设备上进行类型识别,基于识别出来的车辆类型自动进行费用计算。该功能可在发起训练时选选择对应的开关打开即可。..

PaddlePaddle 1670

【无标题】

无

m0_46179081的博客 415

使用Clumsy和Process Explorer定位软件高CPU占用问题

使用弱网模拟工具Clumsy和进程查看工具Process Explorer定位软件高CPU占用问题。

dvlinker的技术专栏 5706

Android 12 大屏时底下显示任务栏以及虚拟按键靠右问题

Android 12 点大屏时,底下导航栏变成显示任务栏,虚拟按键靠右的分析以及修改

Android系统开发笔记 4686

CSP 202206 题解:归一化处理,寻宝大冒险,角色授权,光线追踪,PS无限版

CSP 专业组 202206题解 归一化处理 寻宝!大冒险! 角色授权 光线追踪 PS无限版(部分解)

fmy_xfk的博客 4146

Visual Studio调试技巧与实用方法总结(实战经验分享)

本文根据多年的项目实战经验,详细介绍一些Visual Studio常用的高效调试手段与技巧。

dvlinker的技术专栏 3万+

角色授权CSP202206-3最详细解答

角色授权CSP202206-3最详细解答。

热爱C++和golang的学生 683

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【202206-3】角色授权

map、vectoe、万能头文件

qq_51351004的博客 1149

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

CSP202206-3角色授权

【代码】CSP202206-3角色授权。

追风小小少年的博客 494

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

202206-3 CCF 角色授权 (运用stl容器模拟 + 优化 满分题解)

用于将角色名称与结构体下标进行匹配,这样通过角色的名称就可以快速的找到对应的角色结构体。的话,真的不是特别难,简单的模拟就可以得70+,再小优化一下,就可以拿满分。判断一个用户能否执行某个操作的过程,首先需要将这个人所关联的角色找出来。再根据题目中判断的依据,一步一步模拟就可以了(不是很难,详情见代码)然后给你一个人,以及需要进行的操作,问你这个人能不能执行这个操作。,还没理清楚,就开始写,逻辑上会有很多漏洞,难以调试。判断一个角色是否有xx操作,xx资源种类,xx资源。角色有名字,操作,资源等等。

一只可爱的小猴子的博客 1976

角色授权 CSP 202206-3

角色授权 CSP 202206题目太长我就不截图了,昨天晚上写了这道题,写了100行,只给了20分,不得不说,总感觉自己能拿到满分,但就是不知道哪里错了,改了一会儿,依然是20.后来,找了一个答案,不得不说写的太好了,很清楚,大概大佬就是如此吧,同样100行,我20大佬100,看了大佬代码后,有很多收获,所以在此记录一下。1.代码逻辑有问题其中有个功能要求实现判断某个用户,能不能做某个操作,我的逻辑和题正好相反,虽然它没错,但是浪费了时间,最主要是和题意相反。多做了一些无意义的事情。2.事无巨细,全结构体。

qq_59183443的博客 1029

202206-3 角色授权 100分(含注释)(两种判断方法)

【CCF CSP认证】202206-3 角色授权 100分

qq_30838981的博客 553

CCF CSP 202206-3角色授权【70分】

【代码】CCF CSP 202206-3角色授权【70分】

Brienz 394

CCF角色授权vector超时70分

vectormap。

qq_51219814的博客 213

202206-3 角色授权

csp

qikik的博客 1243

2022-06-03 CCF CSP第三题角色授权(80分超时的进)

第26次csp认证第三题大模拟

AC之炼金术师_博客 1056

CCF-CSP-202206-3-角色授权(70分)

csp考试第3题

yunfeng 684

python 满分解CCF-CSP 真题: 202206-3 角色授权

python 满分解CCF-CSP 真题: 202206-3 角色授权

m0_51181169的博客 1892

CCF-CSP 202206-3 角色授权 Java满分题解

CCF-CSP 202206-3 角色授权 Java满分题解

xianzhi945xz的博客 351
上一篇: 365天挑战LeetCode1000题——Day 042 数组序号转换 + 相对名次 离散化处理
下一篇: 365天挑战LeetCode1000题——Day 043 有效的正方形 数学
ShowM3TheCode
博客等级 码龄5年 29粉丝 173原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值