过了9/11个点,利用 unordered_set 和 unordered_map 模拟
C++ 代码
//角色授权
#include<iostream>
#include<unordered_map>
#include<unordered_set>
#include<vector>
using namespace std;
struct Role {
unordered_set<string>ope;//操作
unordered_set<string>type;//资源类型
unordered_set<string>name;//资源名称
int allope = 0;
int alltype = 0;
};
unordered_map<string, unordered_set<string>>userToRole;//用户名到角色名
unordered_map<string, unordered_set<string>>groupToRole;//用户组到角色名
unordered_map<string, Role>role;//角色 <角色名,角色信息>
int n, m, q;
bool judgeOpe(string r, string o)
{
for (auto t : role[r].ope)
{
if (t == o)
{
return true;
}
}
return false;
}
bool judgeTp(string r, string tp)
{
for (auto t : role[r].type)
{
if (t == tp)
{
return true;
}
}
return false;
}
bool judgeNa(string r, string na)
{
for (auto t : role[r].name)
{
if (t == na)
{
return true;
}
}
return false;
}
bool judge(string r, string op, string tp, string na)
{
if (!role[r].allope && !judgeOpe(r, op))return false;//有无操作
if (!role[r].alltype && !judgeTp(r, tp))return false;//有无资源类型
if (role[r].name.size() != 0 && !judgeNa(r, na))return false;//有无资源名称
return true;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> m >> q;
while (n--)
{
string r;
int nv, no, nn;
cin >> r;
cin >> nv;
while (nv--)
{
string o;
cin >> o;
if (o == "*")role[r].allope = 1;
else role[r].ope.insert(o);
}
cin >> no;
while (no--)
{
string t;
cin >> t;
if (t == "*")role[r].alltype = 1;
else role[r].type.insert(t);
}
cin >> nn;
while (nn--)
{
string na;
cin >> na;
role[r].name.insert(na);
}
}
while (m--)
{
string r; int ns;
cin >> r >> ns;
while (ns--)
{
string x, y;
cin >> x >> y;
if (x == "u")
{
//role[r].u.insert(y);
userToRole[y].insert(r);
}
else if (x == "g")
{
//role[r].g.insert(y);
groupToRole[y].insert(r);
}
}
}
while (q--)
{
string user, caozuo, leixing, mingcheng;
int k; vector<string>zu;
cin >> user >> k;
while (k--)
{
string x;
cin >> x;
zu.push_back(x);
}
cin >> caozuo >> leixing >> mingcheng;
int flag = 0;//判断能否执行
if (userToRole.find(user) != userToRole.end())
{
//对该用户对应的各个角色进行循环
for (auto t : userToRole[user])
{
if (judge(t, caozuo, leixing, mingcheng))
{
flag = 1;
break;
}
}
}
for (int i = 0; i < zu.size() && flag==0; i++)
{
if (groupToRole.find(zu[i]) != groupToRole.end())
{
for (auto t : groupToRole[zu[i]])
{
if (judge(t, caozuo, leixing, mingcheng))
{
flag = 1; break;
}
}
}
}
cout << flag << endl;
}
return 0;
}