试题编号: | 201612-3 |
试题名称: | 权限查询 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统用户通过授权机制获得系统中各个模块的操作权限。 输入格式 输入第一行是一个正整数 p,表示不同的权限类别的数量。紧接着的 p 行被称为 P 段,每行一个字符串,描述各个权限。对于分等级权限,格式为 <category>:<level>,其中 <category> 是权限类名,<level> 是该类权限的最高等级。对于不分等级权限,字符串只包含权限类名。 输出格式 输出共 q 行,每行为 false、true,或者一个数字。false 表示相应的用户不具有相应的权限,true 表示相应的用户具有相应的权限。对于分等级权限的不带等级查询,如果具有权限,则结果是一个数字,表示该用户具有该权限的(最高)等级。如果用户不存在,或者查询的权限没有定义,则应该返回 false。 样例输入 3 样例输出 false 样例说明 样例输入描述的场景中,各个用户实际的权限如下: 评测用例规模与约定 评测用例规模: |
注意:CCF编译环境不支持容器map中包含容器map,顾用结构体代替
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <time.h>
#include <vector>
#include <list>
#include <stack>
using namespace std;
struct Autho {
string name; //权限名
int Level; //等级 -1为无等级
};
struct AA {
map<string, int >A;
};
map<string, int>authority; //权限名、权限等级(-1为无等级)
map<string, AA>User; //用户名、所具有的权限
int main()
{
int i, j, P, R, U, Q;
cin >> P; //表示不同的权限类别的数量
cin.ignore();
stringstream SS;
string S;
for (i = 0; i < P; i++)
{
Autho Save;
getline(cin, S);
int k = S.find(':');
if (k!= -1)
{
S[k] = ' ';
SS.clear();
SS.str(S);
SS >> Save.name;
SS >> Save.Level;
authority[Save.name] = Save.Level;
}
else
{
Save.name = S;
Save.Level = -1;
authority[Save.name] = Save.Level;
}
}
cin >> R; //表示不同的角色数量
cin.ignore();
for (i = 0; i < R; i++)
{
string name;
Autho Save;
int num;
cin >> name >> num;
while (num--)
{
cin >> S;
int k = S.find(':');
if (k != -1)
{
S[k] = ' ';
SS.clear();
SS.str(S);
SS >> Save.name;
SS >> Save.Level;
}
else
{
Save.name = S;
Save.Level = -1;
}
if (User[name].A.find(Save.name) != User[name].A.end())
{
if (User[name].A[Save.name] < Save.Level)
User[name].A[Save.name] = Save.Level;
}
else
User[name].A[Save.name] = Save.Level;
}
}
cin >> U; //表示用户数量
cin.ignore();
for (i = 0; i < U; i++)
{
string name;
Autho Save;
int num;
cin >> name >> num;
while (num--)
{
cin >> S;
for (map<string, int>::iterator it = User[S].A.begin(); it != User[S].A.end(); it++)
{
if (User[name].A.find((*it).first) != User[name].A.end())
{
if (User[name].A[(*it).first] < (*it).second)
User[name].A[(*it).first] = (*it).second;
}
else
User[name].A[(*it).first] = (*it).second;
}
}
}
cin >>Q; //表示权限查询的数量
cin.ignore();
for (i = 0; i < Q; i++)
{
string name;
Autho Save;
cin >> name >> S;
if (User.find(name) != User.end())
{
int k = S.find(':');
if (k != -1)
{
S[k] = ' ';
SS.clear();
SS.str(S);
SS >> Save.name;
SS >> Save.Level;
}
else
{
Save.name = S;
Save.Level = -1;
}
if (User[name].A.find(Save.name) != User[name].A.end())
{
if(Save.Level != -1)
if (User[name].A[Save.name] < Save.Level)
cout << "false" << endl;
else
cout << "true" << endl;
else if(User[name].A[Save.name] != -1)
cout << User[name].A[Save.name] << endl;
else
cout << "true" << endl;
}
else
cout << "false" << endl;
}
else
cout << "false" << endl;
}
cin >> P;
return 0;
}