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)

浙公网安备 33010602011771号