201612-3 权限查询
题目
思路
我这里用 map<string,int> 保存角色的权限,其中string存权限名、int存权限等级(-1表示无等级),用户不用记录其角色,直接将其角色下的权限移至用户的 map<string,int> 下就行。详见代码。
AC代码如下
#include<string>
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
int main(){
int p,r,u,q;
//输入权限
cin>>p;
map<string,int> pri;//权限
for(int i=0;i<p;i++){
string str;
cin>>str;
int t=str.size();
if(str[t-2]==':')
pri[str.substr(0,t-2)]=str[t-1]-'0';
else pri[str]=-1;
}
//输入角色
cin>>r;
map<string,map<string,int> > role;//存角色
for(int i=0;i<r;i++){
string temp,rname;
map<string,int> mp;//存角色的权限
cin>>rname;
int k;
cin>>k;
for(int j=0;j<k;j++){
cin>>temp;
int t=temp.size();
if(temp[t-2]==':'){//判断有无等级
string pp=temp.substr(0,t-2);
if(mp.count(pp)==0)
mp[pp]=temp[t-1]-'0';
else mp[pp]=max(mp[pp],temp[t-1]-'0');//要最高的那个
}
else mp[temp]=-1;
}
role[rname]=mp;
}
//输入用户
cin>>u;
map<string,map<string,int> > user;//存用户
for(int i=0;i<u;i++){
string uname,temp;
map<string,int> mp;//存用户的权限
cin>>uname;
int k;
cin>>k;
for(int j=0;j<k;j++){
cin>>temp;//输入的角色
//把该角色的权限全部添加给用户
for(map<string,int>::iterator it=role[temp].begin();it!=role[temp].end();it++){
string pp=it->first;
if(mp.count(pp)==0) mp[pp]=it->second;
else mp[pp]=max(mp[pp],it->second);
}
}
user[uname]=mp;
}
//查询
cin>>q;
for(int i=0;i<q;i++){
string uname,pp;
cin>>uname>>pp;
int t=pp.size(),c=-1;
if(pp[t-2]==':'){//判断有无等级
c=pp[t-1]-'0';
pp=pp.substr(0,t-2);
}
if(user.count(uname)==0||user[uname].count(pp)==0){//该用户不存在或该用户无该权限
cout<<"false"<<endl;
continue;
}
int uc=user[uname][pp];
if(c==-1&&uc==-1) cout<<"true"<<endl;//查询无等级且权限无等级
else if(c==-1&&uc>=0) cout<<uc<<endl;//查询无等级且权限有等级,输出等级
else if(uc>=c) cout<<"true"<<endl;//权限等级够高(可以跟楼上的楼上合并)
else cout<<"false"<<endl;//权限等级不够
}
return 0;
}