试题编号: | 201612-3 |
试题名称: | 权限查询 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统用户通过授权机制获得系统中各个模块的操作权限。 输入格式 输入第一行是一个正整数 p,表示不同的权限类别的数量。紧接着的 p 行被称为 P 段,每行一个字符串,描述各个权限。对于分等级权限,格式为 <category>:<level>,其中 <category> 是权限类名,<level> 是该类权限的最高等级。对于不分等级权限,字符串只包含权限类名。 输出格式 输出共 q 行,每行为 false、true,或者一个数字。false 表示相应的用户不具有相应的权限,true 表示相应的用户具有相应的权限。对于分等级权限的不带等级查询,如果具有权限,则结果是一个数字,表示该用户具有该权限的(最高)等级。如果用户不存在,或者查询的权限没有定义,则应该返回 false。 样例输入 3 样例输出 false 样例说明 样例输入描述的场景中,各个用户实际的权限如下: 评测用例规模与约定 评测用例规模: |
#include<bits/stdc++.h>
using namespace std;
unordered_map<string,int>category;//存储权限类名和对应的最高等级
unordered_map<string,unordered_map<string,int>>role,user;//存储角色、用户和对应的权限名及等级
pair<string,int> split(string&s){//分割权限类名和等级
int i=s.find(':');
int level=(i!=string::npos)?stoi(s.substr(i+1)):-1;
return make_pair(s.substr(0,i),level);
}
int main(){
int p,r,t,q,n;
string s1,s2;
scanf("%d",&p);
while(p--){//读取权限类名和最高等级
cin>>s1;
category.insert(split(s1));
}
scanf("%d",&r);
while(r--){//读取角色名和对应的权限类名和等级
cin>>s1>>n;
while(n--){
cin>>s2;
pair<string,int>p=split(s2);
if(role[s1].find(p.first)!=role[s1].end())
role[s1][p.first]=min(max(role[s1][p.first],p.second),category[p.first]);
else
role[s1][p.first]=min(p.second,category[p.first]);
}
}
scanf("%d",&t);
while(t--){//读取用户名和对应的角色名
cin>>s1>>n;
while(n--){
cin>>s2;
for(auto&i:role[s2])//遍历对应的角色名,将权限、等级和用户对应存储起来
if(user[s1].find(i.first)!=user[s1].end())
user[s1][i.first]=max(i.second,user[s1][i.first]);
else
user[s1][i.first]=i.second;
}
}
scanf("%d",&q);
while(q--){//查询
cin>>s1>>s2;
pair<string,int>p=split(s2);
if(user.find(s1)!=user.end()&&user[s1].find(p.first)!=user[s1].end()
&&p.second<=user[s1][p.first]){
if(p.second==-1&&user[s1][p.first]!=-1)
printf("%d\n",user[s1][p.first]);
else
puts("true");
}else
puts("false");
}
return 0;
}