题目来源:- 计算机软件能力认证考试系统
#include<bits/stdc++.h>
using namespace std;
pair<string,int> split(string s) { //将":"两边分为两个字符串,保存为pair类型
int pos=s.find(':');
return make_pair(s.substr(0,pos), pos==-1 ? -1 : stol(s.substr(pos+1)));//stol将string转换为int
}
int main() {
int a;
string s1;
cin>>a;
unordered_map<string,int> pri;//<权限名字,权限等级>
while(a--) {
cin>>s1;
pri.emplace(split(s1)); //将pair保存到pri里
}
int b;
string s2;
cin>>a;
unordered_map<string,unordered_map<string,int>> role;//<角色,<权限名字,权限等级>>
while(a--) {
cin>>s1>>b;
while(b--) {
cin>>s2;
auto p=split(s2);
if(role[s1].count(p.first)==0 || p.second>role[s1][p.first])
//如果role里没有对应角色的权限,或者权限等级比之前的权限大,就更新对应的权限等级
role[s1][p.first]=p.second;
}
}
unordered_map<string,unordered_map<string,int>> user;//<用户,<权限名字,优先级>>
cin>>a;
while(a--) {
cin>>s1>>b;
while(b--) {
cin>>s2;
for(auto p:role[s2]) {//对role里每个角色所拥有的权限进行遍历,将role里的权限映射到user里
if(user[s1].count(p.first)==0 || p.second>user[s1][p.first])
//如果user里没有对应的权限,或者权限等级比之前的权限大,就更新对应的权限等级
user[s1][p.first]=p.second;
}
}
}
cin>>a;
while(a--) {
cin>>s1>>s2;
auto p=split(s2);
if(user.count(s1)==0 || user[s1].count(p.first)==0 || p.second>user[s1][p.first])
//如果用户不存在,用户对应的权限不存在,用户的权限等级不够,就输出false
cout<<"false"<<endl;
else if(user[s1][p.first]!=-1 && p.second==-1)
//如果输入的权限不含等级,但权限有等级,就输出权限的等级
cout<<user[s1][p.first]<<endl;
else
cout<<"true"<<endl;
}
return 0;
}