202206 CSP认证 | 角色授权

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

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值