角色授权
fine,又是一道acwing上TLE但是平台通过了的,那就酱吧…
直接跟着题目来模拟的…先找到每个用户授予的所有角色,包括用户本身和它所属的用户组。
然后遍历这个角色集合,看是否有操作权限,种类权限以及资源名称权限。如果同时在一个角色下符合三种权限,则此时可以进行操作,退出角色集合的遍历。
跑了两次都是满分(因为我用了auto
所以提交的cpp14)
以下是平台满分代码:
#include<bits/stdc++.h>
using namespace std;
unordered_map<string, unordered_set<string> > role_opt; //角色可进行的操作
unordered_map<string, unordered_set<string> > role_rtype; //角色所具有的资源种类
unordered_map<string, unordered_set<string> > role_rname; //角色可以操作的资源名称
unordered_map<string, unordered_set<string> > u_role; //用户授予的角色名称
unordered_map<string, unordered_set<string> > g_role; //用户组授予的角色名称
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n, m, q;
cin >> n >> m >> q;
for(int i = 0;i < n;i ++){ //录入角色信息
string name, str; int nv, no, nn;
cin >> name >> nv;
while(nv --){
cin >> str;
role_opt[name].insert(str);
}
cin >> no;
while(no --){
cin >> str;
role_rtype[name].insert(str);
}
cin >> nn;
//如果列表为空,则没有限制
if(!nn) role_rname[name].insert("*");
while(nn --){
cin >> str;
role_rname[name].insert(str);
}
}
for(int i = 0;i < m;i ++){
string name, str1, str2; int ns;
cin >> name >> ns;
while(ns --){
cin >> str1 >> str2;
if(str1 == "u"){
u_role[str2].insert(name);
}
else{
g_role[str2].insert(name);
}
}
}
while(q --){
string uname, op, type, rname, str; int ng;
unordered_set<string> group; //用户组列表
cin >> uname >> ng;
while(ng --){
cin >> str; group.insert(str);
}
cin >> op >> type >> rname;
unordered_set<string> role; //该用户所授予的全部角色名称
for(auto x : u_role[uname]){
role.insert(x);
}
for(auto gname : group){ //每一个用户组
for(auto x : g_role[gname]){
role.insert(x);
}
}
bool flag = false;
for(auto x : role){ //遍历每一个角色
bool flag_op = false, flag_type = false, flag_rname = false;
if(role_opt[x].count(op) || role_opt[x].count("*")) flag_op = true;
if(role_rtype[x].count(type) || role_rtype[x].count("*")) flag_type = true;
if(role_rname[x].count(rname) || role_rname[x].count("*")) flag_rname = true;
if(flag_op && flag_rname && flag_type){
cout << "1\n";
flag = true;
break;
}
}
if(!flag) cout << "0\n";
}
return 0;
}