问题描述
试题编号: | 201612-3 |
试题名称: | 权限查询 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统用户通过授权机制获得系统中各个模块的操作权限。 输入格式 输入第一行是一个正整数 p,表示不同的权限类别的数量。紧接着的 p 行被称为 P 段,每行一个字符串,描述各个权限。对于分等级权限,格式为 <category>:<level>,其中 <category> 是权限类名,<level> 是该类权限的最高等级。对于不分等级权限,字符串只包含权限类名。 输出格式 输出共 q 行,每行为 false、true,或者一个数字。false 表示相应的用户不具有相应的权限,true 表示相应的用户具有相应的权限。对于分等级权限的不带等级查询,如果具有权限,则结果是一个数字,表示该用户具有该权限的(最高)等级。如果用户不存在,或者查询的权限没有定义,则应该返回 false。 样例输入 3 样例输出
扫描二维码关注公众号,回复:
2937768 查看本文章
false 样例说明 样例输入描述的场景中,各个用户实际的权限如下: 评测用例规模与约定 评测用例规模: |
模拟题。!!!特别需要注意的是:
1) 角色对应的权限列表(R 段)中的权限都是之前(P 段)出现过的,权限可以重复出现,如果带等级的权限重复出现,以等级最高的为准
2) 用户对应的角色列表(U 段)中的角色都是之前(R 段)出现过的,如果多个角色都具有某一分等级权限,以等级最高的为准
用map的时候出了个错,就是用insert插入元素时,如果key在map里的话,不会覆盖之前的value,而是会被忽略,用下标法赋值可以解决这个问题。
将每个权限分为类名和等级,当权限为无等级权限时,等级为-1。
AC代码:
#include<iostream>
#include<sstream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<vector>
#include<cmath>
#include<ctime>
#include<stack>
#include<map>
using namespace std;
map<string,int> power; //权限
struct node1//角色
{
string nam;
map<string,int> pri;
}role[101];
struct node2//用户
{
string nam;
vector<string> rol;
}user[101];
int main()
{
int p;cin>>p;
for(int i=1;i<=p;i++)
{
string str;
pair<string,int> p;
cin>>str;
if(str.find(":",0)==string::npos) //无等级权限
p.first=str,p.second=-1;
else p.first=str.substr(0,str.find(":",0)),p.second=str[str.find(":",0)+1]-'0';
power.insert(p);
}
int r;cin>>r;
for(int i=1;i<=r;i++)
{
string str; int t; pair<string,int> p;
cin>>str>>t;
role[i].nam=str;
for(int j=1;j<=t;j++)
{
cin>>str;
if(str.find(":",0)==string::npos) //无等级权限
{
p.first=str,p.second=-1;
role[i].pri.insert(p);
}
else
{
p.first=str.substr(0,str.find(":",0)),p.second=str[str.find(":",0)+1]-'0';
if(p.second>=role[i].pri[p.first]) role[i].pri[p.first]=p.second;
}
}
}
int u;cin>>u;
for(int i=1;i<=u;i++)
{
string str; int t;
cin>>str>>t;
user[i].nam=str;
for(int j=1;j<=t;j++)
{
cin>>str;
user[i].rol.push_back(str);
}
}
int q;cin>>q;
for(int i=1;i<=q;i++)
{
string str1,str;
cin>>str1>>str;
bool flag=false;//是否找到权限且合法
int le=-1;//最大等级
for(int j=1;j<=u;j++)
{
if(user[j].nam==str1) //找到用户
{
for(int k=0;k<user[j].rol.size();k++)//查找角色
{
for(int m=1;m<=r;m++)
{
if(role[m].nam==user[j].rol[k]) //找到角色
{
map<string,int> auth(role[m].pri);//该角色拥有的权限
if(str.find(":",0)==string::npos) //无等级权限查询
{
if(auth.count(str))
flag=1, le=max(le,auth[str]);
}
else //有等级权限查询
{
string cat=str.substr(0,str.find(":",0));
int level=str[str.find(":",0)+1]-'0';
if(auth.count(cat)&&level<=auth[cat]) flag=1;
}
break;
}
}
}
break;
}
}
if(flag&&le!=-1) cout<<le<<endl;//分等级权限的不带等级查询
else if(flag&&le==-1) cout<<"true"<<endl;
else if(!flag) cout<<"false"<<endl;
}
}
附上一组测试样例:
4
crm:0
git:4
game:3
haha
4
hr 2 game:2 haha
it 3 crm:0 git:3 git:2
dev 3 git:3 game:1 game:3
qa 2 crm:0 haha
3
alice 2 hr dev
bob 2 qa it
charlie 1 it
正确结果应该是:
0
3
true
true