AC的快乐无与伦比!
本蒟蒻刚看到这道题时,就被超长的题干和复杂的关系唬住了。
于是学习了各路大神的解法,终于AC 成功照虎画猫了!
现将在此过程中学到的种种知识总结如下,作为本小白菜(不但小白还有菜)的编程笔记。

Attention:

一、C++中的万能头文件

#include<bits/stdc++.h>

在学习许多大神的代码中,发现这个头文件被使用的频率很高。

它是C++中支持的一个几乎万能的头文件,几乎包含所有的可用到的C++库函数。以后写代码就可以直接引用这一个头文件了,不需要在写一大堆vector、string、map、stack……

最初我的vscode中写入这个头文件会提示错误,是因为本地没有该头文件的具体内容。观察发现这是一个stdc++.h,在bits的文件中,因此在头文件iostream所在的文件,创建新文件夹bits,在其中写入stdc++.h就可。

二、题目理解

因为本蒟蒻的记忆能力堪忧,只能通过非常直接的变量命名来告知自己其含义。
最初不明晰各个事物的联系,不知如何组织数据结构,后来找到一个解析是从输入进行入手进行组织分析,甚好。

因此,以下分析也从输入入手:
①输入角色数量roleNum、角色关联数量roleRelatedNum、待检查的操作数量opToCheckNum。
接下来将会根据数量分别循环依次输入对应信息。

②输入角色相关信息。
对于这个重要的中心角色,我们使用结构体来组织数据。

struct role
{string name;map<string, int>op, resKind, resName;
}role[501];

建立起操作名、资源种类名、资源名到01(是否存在)的映射。如果该角色存在string s的操作名,则有role[i].op[s] = 1存在。
那么为什么不将这三类的数量也存入结构体里呢?
最初我是也存的,但是发现之后也用处不大,还占地方,就直接用三个变量opNum、resKindNum、resNameNum直接即时for循环处理之后要读入的相应数据了。
这里还用到一个数据结构是

map<string, int>nameID;

即建立起角色名称到其序号ID的一个映射。

③输入角色关联相关信息。
用户和用户组没有很大区别,可不作区分,这里的重点是,对于每个新用户或用户组(g或u后的字符串),计入与其对应的角色ID(每组输入的第一个字符串)。

map<string, vector<int>>conNameID;

第一次见识了vector。

vector是向量类型,可以容纳许多类型的数据,因此也被称为容器

比如我想让新用户temp存入与其关联的角色id,就

conNameID[temp].push_back(id);

让人不禁感叹,真是简洁又漂亮。

④输入待检查的操作+检查。
使用string group[404]来存放每个操作对应的组。
对于每个要执行操作的用户,先查其在步骤③存的一些关联的角色,使用check检查是否在该角色与之关联的情况下,后续操作是否可行。

这里for循环中使用

conNameID[temp].size()

表示用户temp关联的角色数量。

如果失败,那就再看我们本次输入中给的用户组,对于某一用户组在步骤③存的一些关联角色,使用check检查是否在该角色与之关联的情况下,后续操作是否可行。
其中利用flag标识已确认操作可行,及时退出循环。

⑤check检查是否可行的函数
三层if判断,拿第一层举例:

if((role[id].op.count(o) && role[id].op[o])||( role[id].op.count("*") && role[id].op["*"]))

检查角色是否有待检查的o操作,或者有通配符*标记着任何操作都可行。
大佬的check函数写得真好真妙! 我能说count()这个函数还是第一次见吗

函数返回值是bool类型,之前我一直习惯用int类型的01表示对错。
在一次次地运行超时中,终于动脑子查为啥别人用bool!

bool型变量占用内存一个字节,int型变量占用四个字节。
由于bool型变量只分0或非0,即false(0x00)或者true(0x01)。
在需要逻辑判断时可以使用bool型,可以避免使用int导致运行超时。

AC代码如下:

#include<bits/stdc++.h>
using namespace std;struct role
{string name;map<string, int>op, resKind, resName;
}role[501];map<string, int>nameID;
map<string, vector<int>>conNameID;int roleNum, roleRelatedNum, opToCheckNum;
int resNameNum, opNum, resKindNum, id, conObNum;
int groupNum, flag = 0;
string temp;
string group[404], opName, resKind, resName;bool check(int id,const string &o,const string &z,const string &m)
{if((role[id].op.count(o) && role[id].op[o])||( role[id].op.count("*") && role[id].op["*"]))if((role[id].resKind.count(z) && role[id].resKind[z]) ||(role[id].resKind.count("*") && role[id].resKind["*"]))if((role[id].resName.count(m) && role[id].resName[m] )|| role[id].resName.size() == 0)return true;return false;
}int main()
{cin>>roleNum>>roleRelatedNum>>opToCheckNum;for(int i = 0; i < roleNum; ++i){cin>>role[i].name>>opNum;nameID[role[i].name] = i;for(int j = 0; j < opNum; ++j){cin>>temp;role[i].op[temp] = 1;}cin>>resKindNum;for(int j = 0; j < resKindNum; ++j){cin>>temp;role[i].resKind[temp] = 1;}cin>>resNameNum;for(int j = 0; j < resNameNum; ++j){cin>>temp;role[i].resName[temp] = 1;}}for(int i = 0; i < roleRelatedNum; ++i){cin>>temp;id = nameID[temp];cin>>conObNum;for(int j = 0; j < conObNum; ++j){cin>>temp;cin>>temp;conNameID[temp].push_back(id);}}for(int i = 0; i < opToCheckNum; ++i){flag = 0;cin>>temp>>groupNum;for(int j = 0; j < groupNum; ++j)cin>>group[j];cin>>opName>>resKind>>resName;for(int j = 0; j < conNameID[temp].size(); ++j){int id = conNameID[temp][j];if(check(id, opName, resKind, resName)){flag = 1;break;}}if(!flag){for(int j = 0; j < groupNum; ++j){for(int k = 0; k < conNameID[group[j]].size(); ++k){int id = conNameID[group[j]][k];if(check(id, opName, resKind, resName)){flag = 1;break;}}if(flag)break;}}cout<<flag<<endl;}return 0;
}

经此一役,发现map是个好东西,原来是非常常用的数据结构,它在第二题与第三题中都起了不可或缺的关键作用。
此过程中,通过拜读他人的优秀代码而从中窥得的算法分析、数据结构组织、编程习惯等,本蒟蒻也深深感受到了巨大的差距,实在道阻且长。

【202206-3】角色授权相关推荐

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

    试题内容请前往CCF官网查看: CCF-CSP计算机软件能力认证考试 http://118.190.20.162/home.page 阅读本题解前,您应当了解下列知识: 线段树 教程 C++ 标准库( ...

  2. RDIFramework.NET V3.3 Web版角色授权管理新增角色对操作权限项、模块起止生效日期的设置...

    在实际应用在我们可能会有这样的需求,某个操作权限项(按钮)或菜单在某个时间范围内可以让指定角色访问.此时通过我们的角色权限扩展设置就可以办到. 在我们框架V3.3 Web版本全新增加了角色权限扩展设置 ...

  3. Asp.Net Core 中IdentityServer4 实战之角色授权详解

    一.前言 前几篇文章分享了IdentityServer4密码模式的基本授权及自定义授权等方式,最近由于改造一个网关服务,也用到了IdentityServer4的授权,改造过程中发现比较适合基于Role ...

  4. Flowable快速工作流脚手架_Jsite角色授权不显示

    JSite 快速开发框架,内置Flowable工作流引擎 · 五大基础模块 · 前后端基础代码自动生成 · 权限精确控制. 说明:此版本我已经调通,最新版本正在更新,页面未处理好,因此采用历史版本. ...

  5. .NET快速信息化系统开发框架 V3.2-amp;gt;WinForm版本新增新的角色授权管理界面效率更高、更规范...

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/chinahuyong/article/details/76735793 角色授权管理模块主要是对角色 ...

  6. Spring Security:基于内存的角色授权

    本文来说下Spring Boot+Spring Security:基于内存的角色授权 文章目录 概述 需求缘起 编码思路 基于内存的角色授权 为用户配置角色 开启Spring方法级安全 配置方法级拥有 ...

  7. Jenkin权限控制——基于角色授权策略

    开启授权策略 Jenkins的项目权限控制通过[授权策略]实现,[授权策略]需要plugins提供,首先需要安装Role-based Authorization Strategy 安装Role-bas ...

  8. 信锐无线角色授权详细步骤

    一.无线初级课程实验 1.1 角色授权实验 [实验环境] 1.任意型号 NAP 1 台 [实验内容] 1.搭建一个本地转发的无线网络,对无线终端进行访问控制.流量时长限制.限速. 访问控制策略: 第一 ...

  9. ERROR 1044 (42000): Access denied for user/非root角色授权用户找不到已创建数据库

    没有权限,网上大部分说是 用户密码错误 或者空密码的情况下为了安全 而要通过关闭mysql服务等绕过权限. 但我是在设计数据库实验过程中,设计的用户通过角色授权,在验证用户权限时,发现用户找不到已创建 ...

  10. CCF-CSP真题《202206-3—角色授权》思路+python题解

    想查看其他题的真题及题解的同学可以前往查看:CCF-CSP真题附题解大全 试题编号: 202206-3 试题名称: 角色授权 时间限制: 5.0s 内存限制: 512.0MB 问题描述: 题目背景 为 ...

最新文章

  1. perf+火焰图 = 性能分析利器
  2. qt下编写linux消息队列,C++11消息队列 + Qt线程池 + QRunnable执行任务简单模型
  3. Implicit conversion from enumeration type 'enum CGImageAlphaInfo' to different enumeration type 'CGB
  4. 【2014-11-22】《The Hardware/Software Interface》– Section 5
  5. 四五月份:关键词是沟通、绘画和SQL
  6. GCC笔记 命令行分析
  7. cocos2dx 父元素影响子元素
  8. Codeforces | CF1029F 【Multicolored Markers】
  9. 外边距合并(HTML、CSS)
  10. 【Algorithm】逆序数的分治求解
  11. 无线接入中的移动技术
  12. From Calcite to Tampering with Flink SQL
  13. 电脑删除文件找不到该项目怎么解决
  14. 升级Android Studio 导致的 `Error:Failed to notify project evaluation listener.`解决办法
  15. android 手动连接wifi,android手动连接wifi的过程
  16. 靶机渗透练习43-Lord Of The Root
  17. sql time运算
  18. 锂矿涨到100万一吨碳酸锂,用还是不用?
  19. Termux 使用常用命令
  20. 如何“反脆弱”的过好一个程序员的低碳生活

热门文章

  1. show()与showDialog()的区别
  2. C# OpenCV EmguCV实现扫描文本图像倾斜矫正 实现详解(附源码)
  3. Oracle魔改linux,【更新】一键网络重装系统 - 魔改版(适用于Linux / Windows)
  4. 解决32位微信开发者工具黑屏
  5. python3学习笔记:3.其他部分
  6. html5上色游戏制作,怎样用HTML5 Canvas制作一个简单的游戏
  7. Python数据分析入门(二十):绘制饼图
  8. Java程序员如何使用代码来计算最大公约数和最小公倍数?
  9. python安装urllib2_python urllib2篇
  10. 并发下线程池的最佳数量计算