201612-3 权限查询 100分 109ms
作者:互联网
#include<iostream>
#include<map>
#include<set>
#include<cstring>
using namespace std;
int main(){
int p,r,u,q;
string s;
map<string,int>P;//权限名 等级
map<pair<string,string>,int>M;//角色 权限名
map<string,set<string> >U;//用户 角色
cin>>p;
for(int i=0;i<p;++i){
cin>>s;
int j=0,nj=s.size();
while(j<nj&&s[j]!=':') ++j;
P[s.substr(0,j)]= j<nj?(s[j+1]-'0'):-1;
}
cin>>r,cin.get();
for(int i=0,_s;i<r;++i){
cin>>s>>_s;
for(int j=0;j<_s;++j){
string _r;
cin>>_r;
int k=0,nk=_r.size();
while(k<nk&&_r[k]!=':')++k;
pair<string,string> p(s,_r.substr(0,k));
if(M.find(p)==M.end()) M[p]=nk==k?-1:(_r[k+1]-'0');
else M[p]=max(M[p],nk==k?-1:(_r[k+1]-'0'));//取最大的权限等级
}
}
cin>>u;
for(int i=0,t;i<u;++i){
cin>>s>>t;
for(int j=0;j<t;++j){
string _r;
cin>>_r;
U[s].insert(_r);
}
}
cin>>q;
for(int i=0;i<q;++i){
string _s;
cin>>s>>_s;
int j=0,nj=_s.size(),f=0;
while(j<nj&&_s[j]!=':')++j;
string name=_s.substr(0,j);
if(P.find(name)==P.end()){//如果没有这个权限种类
cout<<boolalpha<<false<<endl;
continue;
}
int level=j==nj?-1:(_s[j+1]-'0'),max_level=P[name],q_level=-1;
if(level>max_level){//如果查询的超过对应权限种类的权限等级
cout<<boolalpha<<false<<endl;
continue;
}
set<string>& UR=U[s];//开始遍历该查询用户的所有角色
for(set<string>::const_iterator it=UR.begin();it!=UR.end()&&f<1;++it){
map<pair<string,string>,int>::const_iterator itM=M.find(pair<string,string>(*it,name));
if(itM!=M.end()){
if(level==-1){
if(itM->second==-1)//不分等级权限的查询
cout<<boolalpha<<true<<endl,f=1;
else//分等级权限的不带等级查询
q_level=max(itM->second,q_level),f=-1;
}
else if(itM->second>=level)//分等级权限的带等级查询
cout<<boolalpha<<true<<endl,f=1;
}
}
if(f==0)//遍历用户角色查询不到
cout<<boolalpha<<false<<endl;
if(f==-1)//分等级权限的不带等级查询
cout<<min(max_level,q_level)<<endl;
}
return 0;
}
标签:109ms,itM,level,int,cin,201612,include,100,权限 来源: https://blog.csdn.net/best335/article/details/99580854