CCF CSP认证201612-3 权限查询

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值