CCF CSP 201612-3 权限查询 python

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")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值