问题描述
试题链接:角色授权
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+