#include <bits/stdc++.h>
using namespace std;
int main()
{
int p,r,u,q;
//p段
scanf("%d",&p);
for(int i=0;i<p;i++){
string str;
cin>>str;//输入跳过,后面用不上
}
//R段
map<string,map<string,int>> roles;//存储角色及其权限,每个角色有任意个权限
scanf("%d",&r);
for(int i=0;i<r;i++){
string name;
int n;
cin>>name>>n;
for(int j=0;j<n;j++){
string str;
cin>>str;
size_t pos=str.find(':');//判断是否带等级
if(pos!=string::npos){//有等级
int ran=str[pos+1]-'0';//获取等级
str=str.substr(0,pos);//获取权限名
if(ran>=roles[name][str])//保留最高权限等级
roles[name][str]=ran;
}
else//无等级,该权限值赋为-1,或者其他负数,这样易于与其他带等级的区分
roles[name][str]=-1;
}
}
//U段
map<string,map<string,int>> users;//存储用户及其权限,每个用户有任意个权限
scanf("%d",&u);
for(int i=0;i<u;i++){
string name;
int n;
cin>>name>>n;
for(int j=0;j<n;j++){
string str;
cin>>str;//角色名
//将该角色拥有的权限加入到该用户
for(map<string,int>::iterator it=roles[str].begin();it!=roles[str].end();it++){
if(it->second==-1)//该权限无等级
users[name][it->first]=-1;
else if(it->second>=users[name][it->first])//该权限有等级,且保留最高等级
users[name][it->first]=it->second;
}
}
}
//Q段
scanf("%d",&q);
for(int i=0;i<q;i++){
string name,str;
cin>>name>>str;
int x=-1;//用于判断是否有等级值,有则将等级值赋给x
size_t pos=str.find(':');
if(pos!=string::npos){//有等级,更新x和str
x=str[pos+1]-'0';
str=str.substr(0,pos);
}
if(users[name].count(str)){//用户有这个权限
//查询不带等级且该权限本就无等级 或 查询带等级且用户持有该权限等级>=x
if((x==-1&&users[name][str]==-1)||(x!=-1&&users[name][str]>=x))
printf("true\n");
//查询不带等级但该权限有等级,输出用户持有该权限的最高等级
else if(x==-1&&users[name][str]!=-1)
printf("%d\n",users[name][str]);
else
printf("false\n");
}
else printf("false\n");//用户无这个权限或用户无任何权限(即不存在此用户)
}
return 0;
}
【CCF-CSP】201612-3 权限查询
于 2023-07-31 22:23:47 首次发布