CCF CSP——202206-3 角色授权

问题描述

试题链接:角色授权

100分题解

此题为较为复杂的模拟题,需要理清两点。

第一,不同的角色有不同的权限(操作,增删改查等等,特殊:'*'可以执行任意操作),以及操作的对象(资源,特殊:'*'表示可以操作任意资源),操作的对象的名称(资源名,特殊:‘空’表示资源名任意);

第二,用户可以直接与单一角色或多个角色关联,用户组可以与单一角色或多个角色关联,用户可以处于多个用户组。

因此,可以构建三个存储结构分别存储角色的权限、用户与角色的关系、用户组与角色的关系。其中,可以将角色封装成类,这里应该选用map以键值对的方式分别存储。数据存储如下图所示

 正常来说,应该是这么设计的。

因为user_name与group_name的值都是存的role数组,考虑合并user_name与group_name;我本意是觉得不应该合并的,因为用户组名与用户名应该可以存在重名的情况(不考虑不同用户重名),但是经过测试,合并之后依然能够获得100分,因此,最终合并了user_name与group_name。如下图所示

题解代码 

python:使用python的字典代替map以及类

roles = dict()
relation = dict()
n, m, q = map(int, input().split())
for i in range(n):
    inputs = input().split()
    j = 0
    role = dict()
    name = inputs[j]
    j += 1
    temp = set()
    for _ in range(int(inputs[j])):
        j += 1
        temp.add(inputs[j])
    role["option"] = temp
    j += 1
    temp = set()
    for _ in range(int(inputs[j])):
        j += 1
        temp.add(inputs[j])
    role["res"] = temp
    j += 1
    temp = set()
    for _ in range(int(inputs[j])):
        j += 1
        temp.add(inputs[j])
    role["res_name"] = temp
    roles[name] = role

for i in range(m):
    inputs = input().split()
    j = 0
    name = inputs[j]
    j += 1
    for _ in range(int(inputs[j])):
        j += 2
        if inputs[j] not in relation:
            relation[inputs[j]] = set()
        relation[inputs[j]].add(name)


def judge(name, opt, res, res_name):
    if name in roles:
        obj = roles[name]
        if ('*' in obj["option"] or opt in obj["option"]) and ('*' in obj["res"] or res in obj["res"]) and (
                not obj["res_name"] or res_name in obj["res_name"]):
            print(1)
            return True
    return False


for _ in range(q):
    flag = False
    inputs = input().split()
    values = set()
    j = 0
    values.add(inputs[j])
    j += 1
    for _ in range(int(inputs[j])):
        j += 1
        values.add(inputs[j])
    for relation_name in values:
        if relation_name in relation:
            for role_name in relation[relation_name]:
                if judge(role_name, inputs[j + 1], inputs[j + 2], inputs[j + 3]):
                    break
            else:
                continue
            break
    else:
        print(0)

 写在最后

 祝大家CSP400+

 祝大家CSP400+

 祝大家CSP400+

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值