202206-3 角色授权

 

 

n,m,q=map(int,input().split())#角色数量、角色关联数量和待检查的操作数量


#角色
name=[]
op=[]
kind=[]
nn=[]
scname=[]

for i in range(n):#每行表示一个角色
    a=list(input().split())
    
    name.append(a[0])#角色名字
    nv=int(a[1])#操作数量
    
    #nv.append(int(a[1]))#操作数量
    oper=[]
    for j in range(nv):
        oper.append(a[2+j])#操作
    op.append(oper)
    
    no=int(a[2+nv])
    
    kinds=[]
    for j in range(no):
        kinds.append(a[3+nv+j])#资源种类
    kind.append(kinds)
    
    nn.append(int(a[3+nv+no]))
    sc=[]
    for j in range(nn[i]):
        sc.append(4+nv+no+j)#资源名称
    scname.append(sc)
#print(name,op,kind,scname)
#关联角色
glname=[]
ns=[]
ug=[]
ugname=[]
for i in range(m):
    a=list(input().split())
    glname.append(a[0])#该角色关联的角色名称
    ns=(int(a[1]))#授权对象的数量
    ugs=[]
    na=[]
    for j in range(ns):
        ugs.append(a[2*j+2])#授权对象是一个用户名称或者用户组名称
        na.append(a[2*j+3])#用户名称或者用户组名称
    ug.append(ugs)
    ugname.append(na)          

for i in range(q):#每行表示一个待授权的行为
    a=list(input().split())
    user=a[0]#执行该操作的用户名称;
                   
    ng=int(a[1])#该用户所属的用户组的数量;
    gname=[]
    for j in range(ng):
        gname.append(a[j+2])#该用户所属的用户组的名称
    ops=a[2+ng]#待查操作的名称
    kinds=a[3+ng]#被操作的资源种类; 
    sc=a[4+ng]#被操作的资源名称
    
    gname.append(user)
    
    #print(gname)
    #判断操作能否被执行
    flag=0
    for u in gname:
        #print('test',u)
        for j in range(m):#对每个关联角色
            #print(ugname[j])
            if u in ugname[j] :
                actor=glname[j]#角色名字
                #print(actor)
                index=name.index(actor)#角色下标
                #print(index,op[index],kind[index],scname[index])
                if '*' in op[index] or ops in op[index]:
                    #print(op[index])
                    if kinds in kind[index] or '*' in kind[index]:
                        #print(kind[index])
                        if sc in scname[index] or [] == scname[index]:#nn[index]==0:
                            #print(scname[index])
                            flag=1
    if flag==1:print(1)
    else:print(0)

100分

#https://blog.csdn.net/m0_51181169/article/details/125903002?ops_request_misc=&request_id=&biz_id=102&utm_term=%20202206-3%20%20%E8%A7%92%E8%89%B2%E6%8E%88%E6%9D%83%20python&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-125903002.142^v73^insert_down3,201^v4^add_ask,239^v2^insert_chatgpt&spm=1018.2226.3001.4187
def pc(x,y):
    if '*' in x or y in x:
        return 1
    return 0
def pzy(x,y):
    if x == [] or y in x:
        return 1
    return 0
def pd(jsm,czm,zylm,zym):#角色名,操作 资源种类 资源名称
    if jsm in jname:
        p = jname[jsm]#所有信息
    else:return 0
    
    nv = int(p[1])
    no = int(p[2 + nv])
    if pc(p[2:2+nv],czm) == 0:
        return 0
    if pc(p[3+nv:3+nv+no],zylm) == 0:
        return 0
    if pzy(p[4+nv+no:],zym) == 0:
        return 0
    return 1

n,m,q = map(int,input().split())#角色数量、角色关联数量和待检查的操作数量。
jsg = {}
jsu = {}
jname = {}
for i in range(n):
    L = list(input().split())
    jname[L[0]] = L #key=角色名称 value=其他信息

for i in range(m):
    L = list(input().split())
    ns = int(L[1])#授权对象的数量
    for j in range(ns):
        if L[2*(j+1)] == 'u':#用户
            if L[2*(j+1)+1] in jsu:
                jsu[L[2*(j+1)+1]].add(L[0])
            else:
                jsu[L[2*(j+1)+1]] = {L[0]}
        else:#用户组
            if L[2*(j+1)+1] in jsg:
                jsg[L[2*(j+1)+1]].add(L[0])
            else:
                jsg[L[2*(j+1)+1]] = {L[0]}
 
sc = [0]*q
for j in range(q):
    L = list(input().split())
    yh = L[0]#用户名称
    ng = int(L[1])#用户组的数量
    yhz = L[2:ng+2]#用户组的名称
    dcz = L[-3]#
    dzyl = L[-2]
    dzy = L[-1]
    if yh in jsu:#如果用户在关联角色中
        jsj = jsu[yh]#找对应关联角色
    else:
        jsj = set()
        
    for i in yhz:#用户组
        if i in jsg:#用户组在关联信息中
            jsj = jsj.union(jsg[i])#关联角色
    if len(jsj) == 0:
        continue
    for i in jsj:#所有关联角色
        if pd(i, dcz, dzyl, dzy) == 1:
            sc[j] = 1
            break
for i in sc:
    print(i)

 

posted @ 2023-03-16 19:44  吃人不吐葡萄  阅读(31)  评论(0)    收藏  举报