试题编号: | 201612-3 |
试题名称: | 权限查询 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统用户通过授权机制获得系统中各个模块的操作权限。 输入格式 输入第一行是一个正整数 p,表示不同的权限类别的数量。紧接着的 p 行被称为 P 段,每行一个字符串,描述各个权限。对于分等级权限,格式为 <category>:<level>,其中 <category> 是权限类名,<level> 是该类权限的最高等级。对于不分等级权限,字符串只包含权限类名。 输出格式 输出共 q 行,每行为 false、true,或者一个数字。false 表示相应的用户不具有相应的权限,true 表示相应的用户具有相应的权限。对于分等级权限的不带等级查询,如果具有权限,则结果是一个数字,表示该用户具有该权限的(最高)等级。如果用户不存在,或者查询的权限没有定义,则应该返回 false。 样例输入 3 样例输出 false 样例说明 样例输入描述的场景中,各个用户实际的权限如下: 评测用例规模与约定 评测用例规模: |
#include<iostream>
#include<vector>
using namespace std;
typedef struct Role{
string name;
vector<string> category;
}Role;
typedef struct User{
string name;
vector<Role> role;
}User;
int analyse(string a,string b){//a是要检查的对象,b是标准
if(b[b.size()-1]>'9' || b[b.size()-1]<'0'){//不分等级的权限
if(a==b)return -1;
}else{//分等级的权限
string b_name=b.substr(0,b.size()-2);
if(a[a.size()-1]>'9' || a[a.size()-1]<'0'){//不分等级的查询
if(a==b_name)return (b[b.size()-1]-'0');
}else{//分等级的查询
string a_name=a.substr(0,a.size()-2);
int a_level=a[a.size()-1]-'0';
int b_level=b[b.size()-1]-'0';
if(a_name==b_name && a_level<=b_level)return -1;
}
}
return -2;
}
int main(){
string category,role,user,temp;
vector<Role> role_temp;
vector<User> USER;
int n,m;
cin>>n;
while(n--)cin>>temp;
cin>>n;
while(n--){
Role r;
cin>>role>>m;
r.name=role;
while(m--){
cin>>category;
r.category.push_back(category);
}
role_temp.push_back(r);
}
cin>>n;
while(n--){
User u;
cin>>user>>m;
u.name=user;
while(m--){
cin>>role;
for(int i=0;i<role_temp.size();i++){
if(role_temp[i].name==role){
u.role.push_back(role_temp[i]);
break;
}
}
}
USER.push_back(u);
}
cin>>n;
while(n--){
cin>>user>>category;
int i,j,k,flag=-3;
for(i=0;i<USER.size();i++){
if(USER[i].name==user){
vector<Role> r=USER[i].role;
for(j=0;j<r.size();j++){
vector<string> str=r[j].category;
for(int k=0;k<str.size();k++){
int res=analyse(category,str[k]);
if(res==-1){
flag=-1;
i=USER.size();j=r.size();k=str.size();
}
else if(res==-2){
if(flag<0)flag=-2;
}
else {
if(res>flag)flag=res;
}
}
}
}
}
if(flag==-1)cout<<"true"<<endl;
else if(flag<=-2)cout<<"false"<<endl;
else cout<<flag<<endl;
}
}
更多相关CCF的试题解答,请点击>>CCF历年认证考试解答