问题描述

  授权 (authorization) 是各类业务系统不可缺少的组成部分,系统用户通过授权机制获得系统中各个模块的操作权限。
  本题中的授权机制是这样设计的:每位用户具有若干角色,每种角色具有若干权限。例如,用户 david 具有 manager 角色,manager 角色有 crm:2 权限,则用户 david 具有 crm:2 权限,也就是 crm 类权限的第 2 等级的权限。
  具体地,用户名和角色名称都是由小写字母组成的字符串,长度不超过 32。权限分为分等级权限和不分等级权限两大类。分等级权限由权限类名和权限等级构成,中间用冒号“:”分隔。其中权限类名也是由小写字母组成的字符串,长度不超过 32。权限等级是一位数字,从 0 到 9,数字越大表示权限等级越高。系统规定如果用户具有某类某一等级的权限,那么他也将自动具有该类更低等级的权限。例如在上面的例子中,除 crm:2 外,用户 david 也具有 crm:1 和 crm:0 权限。不分等级权限在描述权限时只有权限类名,没有权限等级(也没有用于分隔的冒号)。
  给出系统中用户、角色和权限的描述信息,你的程序需要回答多个关于用户和权限的查询。查询可分为以下几类:
  * 不分等级权限的查询:如果权限本身是不分等级的,则查询时不指定等级,返回是否具有该权限;
  * 分等级权限的带等级查询:如果权限本身分等级,查询也带等级,则返回是否具有该类的该等级权限;
  * 分等级权限的不带等级查询:如果权限本身分等级,查询不带等级,则返回具有该类权限的等级;如果不具有该类的任何等级权限,则返回“否”。

样例输入

3
crm:2
git:3
game
4
hr 1 crm:2
it 3 crm:1 git:1 game
dev 2 git:3 game
qa 1 git:2
3
alice 1 hr
bob 2 it qa
charlie 1 dev
9
alice game
alice crm:2
alice git:0
bob git
bob poweroff
charlie game
charlie crm
charlie git:3
malice game

样例输出

false
true
false
2
false
true
false
true
false

样例说明

  样例输入描述的场景中,各个用户实际的权限如下:
  * 用户 alice 具有 crm:2 权限
  * 用户 bob 具有 crm:1、git:2 和 game 权限
  * 用户 charlie 具有 git:3 和 game 权限
  * 用户 malice 未描述,因此不具有任何权限

评测用例规模与约定

  评测用例规模:
  * 1 ≤ p, r, u ≤ 100
  * 1 ≤ q ≤ 10 000
  * 每个用户具有的角色数不超过 10,每种角色具有的权限种类不超过 10
  约定:
  * 输入保证合法性,包括:
  1) 角色对应的权限列表(R 段)中的权限都是之前(P 段)出现过的,权限可以重复出现,如果带等级的权限重复出现,以等级最高的为准
  2) 用户对应的角色列表(U 段)中的角色都是之前(R 段)出现过的,如果多个角色都具有某一分等级权限,以等级最高的为准
  3) 查询(Q 段)中的用户名和权限类名不保证在之前(U 段和 P 段)出现过
  * 前 20% 的评测用例只有一种角色
  * 前 50% 的评测用例权限都是不分等级的,查询也都不带等级
  字符串模拟,对权限,角色,用户建立结构体,用户里保存每个角色的编号,查询时暴力搜索即可。
  提交后得100分的C++程序如下:

#include<iostream>
#include<string>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
struct privilege
{string name;int level; //若为-1代表不分等级
}pr[105];
struct role
{string name;int sum;privilege p[15];
}ro[105];
struct user
{string name;int sum;int ro[15];
}us[105];
int main()
{int p,r,u, q;map<string,int> m1, m2, m3;//分别为权限,角色,用户的映射string s;cin >> p;for(int i=1;i<=p;i++){cin >> s;int pos = s.find(":");if (pos == string::npos) pr[i].name = s, pr[i].level = -1, m1[s]= i;else pr[i].name = s.substr(0, pos), pr[i].level = s[pos + 1] - '0', m1[s.substr(0, pos)] = i;}int total;// 角色的权限数量cin >> r;for (int i = 1; i <= r; i++){cin >> s >> total;ro[i].name = s, m2[s] = i, ro[i].sum = total;for (int j = 1; j <= total; j++){cin >> s;int pos = s.find(":");if (pos == string::npos) ro[i].p[j].name = s, ro[i].p[j].level = -1;else ro[i].p[j].name = s.substr(0, pos), ro[i].p[j].level = s[pos + 1] - '0';}}cin >> u;for (int i = 1; i <= u; i++){cin >> s >> total;us[i].name = s, m3[s] = i, us[i].sum = total;for (int j = 1; j <= total; j++){cin >> s;us[i].ro[j] = m2[s];}}cin >> q;string s1, s2;while (q--){cin >> s1 >> s2;if (m3.count(s1) == 0){cout << "false" << endl;continue;}int usno = m3[s1];//用户序号int pos = s2.find(":");bool flag = false;int maxlevel = -1;if (pos == string::npos){if (m1.count(s2) == 0){cout << "false" << endl;continue;}for (int i = 1; i <= us[usno].sum; i++){int rono = us[usno].ro[i];//角色序号for (int j = 1; j <= ro[rono].sum;j++){if (ro[rono].p[j].name == s2) flag = true, maxlevel = max(maxlevel, ro[rono].p[j].level);}}if (flag){if (maxlevel == -1) {cout << "true" << endl;}else cout << maxlevel << endl;}else cout << "false" << endl;   }else{int level = s2[pos + 1] - '0';string s3 = s2.substr(0, pos);if (m1.count(s3) == 0){cout << "false" << endl;continue;}for (int i = 1; i <= us[usno].sum; i++){int rono = us[usno].ro[i];//角色序号for (int j = 1; j <= ro[rono].sum; j++){if (ro[rono].p[j].name == s3)  maxlevel = max(maxlevel, ro[rono].p[j].level);}}if (maxlevel >= level) cout << "true" << endl;else cout << "false" << endl;}}return 0;
}

ccf 201612-3 权限查询(100分)相关推荐

  1. CCF 201712-4 行车路线(100分)

    思路 难点在于 大小路的混合, 连续走 小路时 L1,L2,产生的疲劳值为(L1+L2)的平方,而不是 (L1 的平方 +L2 的平方) 解决思路 把大路和小路分开在两张图上考虑,由于小路的疲劳值为连 ...

  2. ccf 201703-4 地铁修建(100分)

    问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁. 地铁由很多段隧道组成,每段隧道连接两个交通枢纽.经过勘探,有m段隧道作为候选,两个交通 ...

  3. CCF之地铁修建(100分)

    问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁. 地铁由很多段隧道组成,每段隧道连接两个交通枢纽.经过勘探,有m段隧道作为候选,两个交通 ...

  4. 小白能看懂的csp202009-1称检测点查询100分答案

    题目背景 2020 年 6 月 8 日,国务院联防联控机制发布<关于加快推进新冠病毒核酸检测的实施意见>,提出对"密切接触者"等八类重点人群"应检尽检&quo ...

  5. CCF认证考试 202012-5星际旅行 (100分)(线段树)

    题目描述 传送门: 星际旅行 思路 根据题目描述,这道题显然是一道线段树的模板题.动力加和动力增强用对应线段树的区间加和区间乘操作.关键是旋转操作,回忆一下,线段树的区间加和区间乘都有对应的懒标记,而 ...

  6. ccf认证 201712-4行车路线(100分)

    题目: 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好走,如果连续走小道,小明的疲劳值会快速增加,连 ...

  7. CCF202012-5 星际旅行【线段树】(100分题解链接)

    试题编号: 202012-5 试题名称: 星际旅行 时间限制: 3.0s 内存限制: 512.0MB 问题描述: 题目描述 乔帝要规划一次星际旅行,星际空间可以视为一个3维坐标系,乔帝有n(n≤1,0 ...

  8. CCF201612-3 权限查询(100分)

    试题编号: 201612-3 试题名称: 权限查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统 ...

  9. CCF系列题解--2016年12月第三题 权限查询

    问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统用户通过授权机制获得系统中各个模块的操作权限. 本题中的授权机制是这样设计的:每位用户具有若干角色,每种角色具有若 ...

最新文章

  1. 中国AI开发者真实现状:写代码这条路,会走多久?
  2. observeOn()与subscribeOn()的详解
  3. spring mvc 异常统一处理方式
  4. Elasticsearch之search搜索入门
  5. session开启慢的原因及解决办法
  6. Eclipse中clean项目的作用
  7. 神经网络训练3次就准确率不变_1组高效徒手训练,6个动作每周3-5次,帮你在家高效率燃脂增肌!...
  8. 简洁精美的图片在线压缩网站html源码
  9. 火力发电厂与变电站设计防火标准_详细解析仓库防火设计标准
  10. 360 安全浏览器尝试收费;苹果macOS首次出现在云端;pip 20.3 发布|极客头条
  11. 计算机上wps表格乘除算法,excel乘法公式-WPS表格乘法运算大全
  12. 医学图像处理眼科检查
  13. 使用电脑群控制手机时,电脑硬件配置如何配?
  14. Excel对图片的组合以及选择
  15. 如何将Nios II硬件和软件合成一个文件(NIOS II)烧进EPCS falsh
  16. 对 Python 代码使用的词语标记化器 tokenize,你懂了吗?【Python|标准库|tokenize】
  17. 基于MATLAB/Simulink的Buck变换器仿真模型,包含开环控制和闭环控制两种控制
  18. 支持Micro USB安卓接口与iphone 8手机的5W无线充电芯片|无线快充芯片小封装SOP8外围简单精简
  19. iOS获取高德地图实现持续定位功能
  20. Ansible常用配置及命令

热门文章

  1. 音乐在线教育解决方案,打造在线教育高品质教学体验
  2. CSP基础-CSP入门简介
  3. 【SVG】svg入门
  4. day12_XML解析
  5. 关于时隙、RB、RE、PRB等概念的笔记
  6. TensorFlow实现非线性回归
  7. go语言 func函数
  8. 博弈论分析题_博弈论复习题及答案
  9. windows下更改中文用户名为英文
  10. vivo全球商城架构演进之路