经典大模拟题,这次相对来说还是比较简单的,需要细心理解题意即可
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
const int N = 510;
int n, m, q; //角色数量,角色关联数量,待检测操作数量
struct Role{ //character
string name;
int nv, no, nn;//操作集合 资源种类集合 资源名称集合
unordered_map<string, int> op;
unordered_map<string, int> type;
unordered_map<string, int> source;
}role[N];
unordered_map<string, int> roletoid;
unordered_map<string, vector<int> > usertoid;
unordered_map<string, vector<int> > grouptoid;
bool check(int id, string o, string t, string s)
{
if (role[id].op.count(o) == 0 && role[id].op.count("*") == 0) return false;
if (role[id].type.count(t) == 0 && role[id].type.count("*") == 0) return false;
if (role[id].source.count(s) == 0 && role[id].nn != 0) return false;
return true;
}
int main()
{
cin >> n >> m >> q;
for (int i = 0; i < n; i ++) //输入每个角色的信息
{
cin >> role[i].name;
roletoid[role[i].name] = i;
string t; int m;
cin >> m;
for (int j = 0; j < m; j ++)
{
cin >> t;
role[i].op[t] = 1;
}
cin >> m;
for (int j = 0; j < m; j ++)
{
cin >> t;
role[i].type[t] = 1;
}
cin >> role[i].nn;
for (int j = 0; j < role[i].nn; j ++)
{
cin >> t;
role[i].source[t] = 1;
}
}
for (int i = 0; i < m; i ++) //输入每个角色关联的信息
{
string s; cin >> s; //角色名称
int id = roletoid[s];
int m; cin >> m;
for (int j = 0; j < m; j ++)
{
char t; cin >> t;
string name; cin >> name;
if (t == 'u')
usertoid[name].push_back(id);
else
grouptoid[name].push_back(id);
}
}
for (int i = 0; i < q; i ++)
{
string un; cin >> un; //用户名称
int ng; cin >> ng;
string ugroup[N];
for (int j = 0; j < ng; j ++) cin >> ugroup[j];
string op, type, source;
cin >> op >> type >> source;
bool flag = false;
for (int id: usertoid[un])
if (check(id, op, type, source))
flag = true;
if (!flag)
{
for (int j = 0; j < ng; j ++)
for (int id: grouptoid[ugroup[j]])
if (check(id, op, type, source))
flag = true;
}
if (flag) cout << 1 << endl;
else cout << 0 << endl;
}
return 0;
}