201612-3 权限查询
"""
# 对于分等级权限,格式为 <category>:<level>,其中 <category> 是权限类名,
<level> 是该类权限的最高等级。对于不分等级权限,字符串只包含权限类名。
crm:2 ['crm',''2] rank
git:3 ['git','3'] rank
game ['game'] no rank
# print(quanxian)
# {'crm': 2, 'git': 3, 'game': ''}
"""
p = int(input())
quanxian = {}
for i in range(p):
s= input().split(":")
if len(s) == 1:
quanxian[s[0]] =""
else:
quanxian[s[0]]=int(s[1])
"""
<role> <s> <privilege 1> <privilege 2> ... <privilege s>
其中 <role> 是角色名称,<s> 表示该角色具有多少种权限。
后面 <s> 个字符串描述该角色具有的权限,格式同 P 段。
hr 1 crm:2
it 3 crm:1 git:1 game
dev 2 git:3 game
qa 1 git:2
{'hr': [['crm', '2']],
'it': [['crm', '1'], ['git', '1'], ['game']],
'dev': [['git', '3'], ['game']],
'qa': [['git', '2']]}
"""
r = int(input())
roles = {}
for i in range(r):
data = input().split()
n_s = int(data[1])
role_quanxian = []
for j in range(n_s):
role_quanxian.append(data[2+j].split(":"))
roles[data[0]] = role_quanxian
"""
接下来一行是一个正整数 u,表示用户数量。
紧接着的 u 行被称为 U 段,每行描述一个用户,格式为
<user> <t> <role 1> <role 2> ... <role t>
其中 <user> 是用户名,<t> 表示该用户具有多少种角色。
后面 <t> 个字符串描述该用户具有的角色。
alice 1 hr
bob 2 it qa
charlie 1 dev
{
'alice': {'crm': 2},
'bob': {'crm': 1, 'git': 2, 'game': ''},
'charlie': {'git': 3, 'game': ''}
}
"""
u = int(input())
users = {}
for i in range(u):
data = input().split()
n_t = int(data[1])
user_role = []
for j in range(n_t):
user_role.append(data[2+j])
user_quanxian = {}
for role in user_role:
for quanxian in roles[role]:
if len(quanxian)==1:
# e.g. ['game'] which is no rank
user_quanxian[quanxian[0]] = ""
elif quanxian[0] not in user_quanxian:
# if user have multiple role which has same quanxian
# "it" and "qa" both has the quanxian "git", choose max value
user_quanxian[quanxian[0]]= int(quanxian[1])
else:
user_quanxian[quanxian[0]] = max(int(quanxian[1]),user_quanxian[quanxian[0]])
# define the quanxian user has!
users[data[0]] = user_quanxian
# print(users)
"""
接下来一行是一个正整数 q,表示权限查询的数量。
紧接着的 q 行被称为 Q 段,每行描述一个授权查询,格式为 <user> <privilege>,
表示查询用户 <user> 是否具有 <privilege> 权限。
如果查询的权限是分等级权限,则查询中的 <privilege> 可指定等级,表示查询该用户是否具有该等级的权限;
也可以不指定等级,表示查询该用户具有该权限的等级。
对于不分等级权限,只能查询该用户是否具有该权限,查询中不能指定等级。
"""
q = int(input())
for i in range(q):
name, query = input().split()
quanxian = query.split(":")
if name in users:
if quanxian[0] in users[name]:
if len(quanxian) == 1:
if users[name][quanxian[0]] == "":
print("true")
else:
print(users[name][quanxian[0]])
elif len(quanxian) == 2:
if users[name][quanxian[0]] == "":
print("false")
elif int(quanxian[1]) <= users[name][quanxian[0]]:
print("true")
else:
print("false")
else:
# quanxian not exist
print("false")
else:
# user not exist!
print("false")