201612-3 权限查询 100分 109ms

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;
}
上一篇:ITM将在2020 CES上展示新的区块链认证项目


下一篇:printf系列教程03_SWO打印输出配置,基于Keil『Debug(printf)Viewer』