这道题感觉主要考的是对于map的灵活运用,选择好存储方式,数据一个个往里填就行。代码在下面
问题描述
试题编号: | 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<algorithm>
#include<unordered_map>
#include<climits>
#include<queue>
#include<map>
#include<string>
#include<vector>
const int INF = INT_MAX;
using namespace std;
struct node{
string name;
int rank;
};
int p, r, u, q;
map<string, int> p_priv;
map<string, vector<node> > p_role;
map<string, vector<string> >p_person;
int main(){
//freopen("data.txt", "r", stdin);
scanf("%d", &p);
//int cnt = 1;
for(int i = 0; i < p; i++){
string str, name;
int rank;
cin >> str;
int x;
if((x=str.find(":")) != -1){
name = str.substr(0, x);
rank = stoi(str.substr(x+1));
}else{
name = str;
rank = -1;
}
//cout << "P: name = " << name << "rank = " << rank <<endl;
p_priv[name] = rank;
}
scanf("%d", &r);
for(int i = 0; i < r; i++){
string rolename, name;
int rank;
cin >> rolename;
int s;
scanf("%d", &s);
vector<node> tempv;
tempv.clear();
for(int j = 0; j < s; j++){
string str;
cin >> str;
int x;
if((x=str.find(":")) != -1){
name = str.substr(0, x);
rank = stoi(str.substr(x+1));
}else{
name = str;
rank = -1;
}
//cout << "S: name = " << name << "rank = " << rank <<endl;
tempv.push_back(node{name, rank});
}
p_role[rolename] = tempv;
}
scanf("%d", &u);
for(int i = 0; i < u; i++){
string username;
cin >> username;
int t;
scanf("%d", &t);
vector<string> tempv;
tempv.clear();
for(int j = 0 ; j < t; j++){
string str;
cin >> str;
//cout << "T: name = " << str <<endl;
tempv.push_back(str);
}
p_person[username] = (tempv);
}
scanf("%d", &q);
for(int i = 0; i < q; i++){
string str, username, name;
int rank;
cin >> username >> str;
if(p_person.find(username) == p_person.end()){
printf("false\n");
continue;
}
int x;
if((x=str.find(":")) != -1){//带等级查询是否
name = str.substr(0, x);
rank = rank = stoi(str.substr(x+1));
vector<string> tempv = p_person[username];
int findok = 0;
for(int j = 0; j < tempv.size() && !findok; j++){
string rolename = tempv[j];
vector<node> tempvn = p_role[rolename];
for(int k = 0; k < tempvn.size(); k++){
if(tempvn[k].name == name && tempvn[k].rank >= rank){
findok = 1;
break;
}
}
}
printf("%s\n", findok ? "true" : "false");
}else{
name = str;
rank = -1;
if(p_priv[name] == -1){//无等级查询是否
vector<string> tempv = p_person[username];
int findok = 0;
for(int j = 0; j < tempv.size() && !findok; j++){
string rolename = tempv[j];
vector<node> tempvn = p_role[rolename];
for(int k = 0; k < tempvn.size(); k++){
if(tempvn[k].name == name){
findok = 1;
break;
}
}
}
printf("%s\n", findok ? "true" : "false");
}else{//带等级查询等级
vector<string> tempv = p_person[username];
int Maxrank = -1;
for(int j = 0; j < tempv.size(); j++){
string rolename = tempv[j];
vector<node> tempvn = p_role[rolename];
for(int k = 0; k < tempvn.size(); k++){
if(tempvn[k].name == name){
Maxrank = max(Maxrank, tempvn[k].rank);
}
}
}
if(Maxrank != -1)
printf("%d\n", Maxrank);
else
printf("false\n");
}
}
}
}