* 用户 bob 具有 crm:1、git:2 和 game 权限
* 用户 charlie 具有 git:3 和 game 权限
* 用户 malice 未描述,因此不具有任何权限
评测用例规模与约定
评测用例规模:
* 1 ≤ p, r, u ≤ 100
* 1 ≤ q ≤ 10 000
* 每个用户具有的角色数不超过 10,每种角色具有的权限种类不超过 10
约定:
* 输入保证合法性,包括:
1) 角色对应的权限列表(R 段)中的权限都是之前(P 段)出现过的,权限可以重复出现,如果带等级的权限重复出现,以等级最高的为准
2) 用户对应的角色列表(U 段)中的角色都是之前(R 段)出现过的,如果多个角色都具有某一分等级权限,以等级最高的为准
3) 查询(Q 段)中的用户名和权限类名不保证在之前(U 段和 P 段)出现过
* 前 20% 的评测用例只有一种角色
* 前 50% 的评测用例权限都是不分等级的,查询也都不带等级
思路:输入的权限在程序过程中是无用的,因为职位本身已经有了对应的权限,只需要把职位对应的权限存入相应的拥有该职位的人的名下,进行查询便可,注意输入和
一个人有两个职位,这两个职位对应相同权限不同等级的问题。
#include<bits/stdc++.h>
using namespace std;
struct Quanxian{
string s;
int n=-1;
};
struct Jiaose{
string s;
int n;
struct Quanxian quan[100];
};
struct Mingzi{
string s;
int n;
vector<Quanxian> q;
};
int main(){
struct Quanxian quan[100];
struct Jiaose jiao[100];
struct Mingzi ming[100];
int n1,n2,n3,n4;
cin>>n1;
string st;
for(int i=0;i<n1;i++){
cin>>st;
int l=st.length();
if(st[l-2]==':'){
quan[i].n=st[l-1]-'0';
quan[i].s=st.substr(0,l-2) ;
}else
quan[i].s=st;
}
cin>>n2;
for(int i=0;i<n2;i++){
cin>>jiao[i].s;
cin>>jiao[i].n;
for(int k=0;k<jiao[i].n;k++){
cin>>st;
int l=st.length();
if(st[l-2]==':'){
jiao[i].quan[k].n=st[l-1]-'0';
jiao[i].quan[k].s=st.substr(0,l-2) ;
}else
jiao[i].quan[k].s=st;
}
}
cin>>n3;
for(int i=0;i<n3;i++){
cin>>ming[i].s;
cin>>ming[i].n;
for(int k=0;k<ming[i].n;k++){
cin>>st;
for(int j=0;j<n2;j++){
if((st==jiao[j].s)){
for(int y=0;y<jiao[j].n;y++){
ming[i].q.push_back(jiao[j].quan[y]);
}
break;
}
}
}
}
cin>>n4;
string st1;
for(int i=0;i<n4;i++){
cin>>st;
int n=0;
bool b=false;
bool c=false;
bool d=false;
for(int k=0;k<n4;k++){
if(st==ming[k].s){
c=true;
cin>>st1;
int l=st1.length();
if(st1[l-2]==':'){
n=st1[l-1]-'0';
st1=st1.substr(0,l-2);
int tem=ming[k].q.size();
for(int j=0;j<tem;j++){
if(ming[k].q[j].s==st1){
if(n<=ming[k].q[j].n){
b=true;
cout<<"true"<<endl;
break;
}
}
}
if(!b){
cout<<"false"<<endl;
}
}else{
int tem=ming[k].q.size();
for(int j=0;j<tem;j++){
if(ming[k].q[j].s==st1){
// d=true;
if(ming[k].q[j].n==-1){
b=true;
cout<<"true"<<endl;
break;
}else{
if(ming[k].q[j].n>n){
n=ming[k].q[j].n;
}
}
}
}
if(!b){
if(n!=0)
cout<<n<<endl;
else
cout<<"false"<<endl;
}
}
}
if(c)
break;
}
if(!c)
cout<<"false"<<endl;
}
return 0;
}