201612-3 | |
试题名称: | 权限查询 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统用户通过授权机制获得系统中各个模块的操作权限。 输入格式 输入第一行是一个正整数 p,表示不同的权限类别的数量。紧接着的 p 行被称为 P 段,每行一个字符串,描述各个权限。对于分等级权限,格式为 <category>:<level>,其中 <category> 是权限类名,<level> 是该类权限的最高等级。对于不分等级权限,字符串只包含权限类名。 输出格式 输出共 q 行,每行为 false、true,或者一个数字。false 表示相应的用户不具有相应的权限,true 表示相应的用户具有相应的权限。对于分等级权限的不带等级查询,如果具有权限,则结果是一个数字,表示该用户具有该权限的(最高)等级。如果用户不存在,或者查询的权限没有定义,则应该返回 false。 样例输入 3 样例输出 false 样例说明 样例输入描述的场景中,各个用户实际的权限如下: 评测用例规模与约定 评测用例规模: |
思路:用map保存权限与其对应的level。用map保存角色,及其拥有的权限vector。
查寻时候遍历查询。注意有分类等级需要查询其具体等级时候,需要查出最大的等级。
code:
#include<cstdio>
#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<cstring>
#include<set>
#include<cmath>
#include<queue>
#include<algorithm>
#define rep(i,j,k) for(int i=j;i<k;++i)
#define mst(a,b) memset((a),(b),sizeof(a))
#define pb push_back
#include<cstring>
#define fi first
#define se second
using namespace std;
typedef long long LL;
typedef vector<int,int> vii;
typedef pair<string,int> psi;
int num(string str){
int ans = 0;
rep(i,0,str.size()){
ans = ans*10 + str[i] -'0';
}
return ans;
}
int main()
{
//freopen("input.txt","r",stdin);
string str,label;
int p,r,u,t,q,cls;
cin >> p;
int pos;
map<string,int> pri;
while(p--){
cin >> str;
if((pos = str.find(":")) != string::npos){
label = str.substr(0,pos);
cls = num(str.substr(pos+1));
pri[label] = cls;
}
else{
pri[str] = -1; // -1表示不是分类等级
}
}
map<string,vector<psi>> role_pri;
string role;
int s;
cin >> r;
while(r--){
cin >> role >> s;
rep(i,0,s){
cin >> str;
if((pos = str.find(":")) != string::npos){
label = str.substr(0,pos);
cls = num(str.substr(pos+1));
role_pri[role].pb(make_pair(label,cls));
}
else{
role_pri[role].pb(make_pair(str,-1)); // -1表示为非分类等级
}
}
}
string cur_user;
cin >> u;
map<string,vector<string>> user;
while(u--){
cin >> cur_user >> t;
rep(i,0,t){
cin >> str;
user[cur_user].pb(str);
}
}
string q_user;
cin >> q;
while(q--){
cin >> q_user >> str;
if(user.find(q_user) == user.end())
cout << "false" << endl;
else{
if((pos = str.find(":")) != string::npos){ //有:一定是有分类等级的并且查询该等级是否存在
string cur_pri = str.substr(0,pos);
if(pri.find(cur_pri) == pri.end()){ //不存在这个类别的权限
cout << "false" << endl;
continue;
}
vector<string> vec = user[q_user];
bool flag = false;
rep(i,0,vec.size()){
role = vec[i];
//遍历 当前角色的 权限
for(auto it = role_pri[role].begin(); it != role_pri[role].end(); ++it){
if(it->fi == cur_pri && it->se >= (num(str.substr(pos+1)))){
flag = true;
}
if(flag)
break;
}
if(flag)
break;
}
if(flag) cout << "true" <<endl;
else cout << "false" << endl;
}
else{
if(pri.find(str) == pri.end()){// 不存在这个权限类别
cout << "false" << endl;
}
else if(pri[str] != -1){ //表示str表示有等级的权限,需要查出其具有的等级是多少
string cur_pri = str;
vector<string> vec = user[q_user];
bool flag = false;
int c = -1;
rep(i,0,vec.size()){
role = vec[i];
for(auto it = role_pri[role].begin(); it != role_pri[role].end(); ++it){
if(it->fi == cur_pri && it->se >= 0){
c = max(c,it->se);//取最大权限
flag = true;
}
}
}
if(flag) cout << c << endl;
else cout << "false" << endl;
}
else{ //不是带等级的权限
string cur_pri = str;
vector<string> vec = user[q_user];
bool flag = false;
rep(i,0,vec.size()){
role = vec[i];
for(auto it = role_pri[role].begin(); it != role_pri[role].end(); ++it){
if(it->fi == cur_pri){
flag = true;
break;
}
if(flag)
break;
}
if(flag)
break;
}
if(flag) cout << "true" <<endl;
else cout << "false" << endl;
}
}
}
}
return 0;
}