角色授权
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;
}