AcWing 3239. 权限查询
原题链接
中等
作者:
来不及了
,
2022-05-10 14:17:49
,
所有人可见
,
阅读 192
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <vector>
using namespace std;
typedef pair<string, int> PSI;
const int N = 1e4+10, M = 110;
unordered_map<string,vector<string>> mp; // 用户有那些角色
unordered_map<string,vector<PSI>> role;//角色有那些权限
unordered_map<string,int> st; //权限的最高等级
int p,r,u,q;
int main()
{
cin >> p;
for(int i=1;i<=p;i++)
{
string str;
cin >> str;
if(str[str.size()-2] == ':')
{
// 带等级的
int le = str[str.size() - 1] - '0';
string name = str.substr(0,str.size() - 2);
st[name] = le;
}
else
{
// 不带等级的
st[str] = -1;
}
}
cin >> r;
for (int i = 1; i <= r; i ++ )
{
string name; //角色名
cin >> name;
int num;
cin >> num;
for (int j = 1; j <= num; j ++ )
{
string str;
cin >> str;
if(str[str.size()-2] == ':')
{
// 带等级的
int le = str[str.size() - 1] - '0';
string s = str.substr(0,str.size() - 2);
role[name].push_back({s,le});
}
else
{
// 不带等级的
role[name].push_back({str,-1});
}
}
}
cin >> u;
for (int i = 1; i <= u; i ++ )
{
string name; //用户名
cin >> name;
int num;
cin >> num;
for (int j = 0; j < num; j ++ )
{
string r;
cin >> r;
mp[name].push_back(r);
}
}
cin >> q;
while (q --)
{
string user,quan;
cin >> user >> quan;
string name;
int level;
if(quan[quan.size() - 2] == ':')
{
name = quan.substr(0,quan.size() - 2);
level = quan[quan.size()-1] - '0';
}
else
{
name = quan;
level = -1;
}
int anslevel = -2;
for(auto t : mp[user])
{
for(auto item : role[t])
{
if(item.first == name)
{
anslevel = max(anslevel,item.second);
}
}
}
if(st[name] == -1)
{
if(anslevel == -1)
{
puts("true");
}
else
{
puts("false");
}
}
else
{
if(level == -1)
{
if(anslevel != -2)
{
cout << anslevel << "\n";
}
else
{
puts("false");
}
}
else
{
if(anslevel >= level)
{
puts("true");
}
else puts("false");
}
}
}
return 0;
}