CCF 201612-3 权限查询 100分

 题目来源:- 计算机软件能力认证考试系统

#include<bits/stdc++.h>

using namespace std;

pair<string,int> split(string s) { //将":"两边分为两个字符串,保存为pair类型
	int pos=s.find(':');
	return make_pair(s.substr(0,pos), pos==-1 ? -1 : stol(s.substr(pos+1)));//stol将string转换为int
}

int main() {
	int a;
	string s1;
	cin>>a;
	unordered_map<string,int> pri;//<权限名字,权限等级> 
	while(a--) {
		cin>>s1;
		pri.emplace(split(s1)); //将pair保存到pri里
	}

	int b;
	string s2;
	cin>>a;
	unordered_map<string,unordered_map<string,int>> role;//<角色,<权限名字,权限等级>>
	while(a--) {
		cin>>s1>>b;
		while(b--) {
			cin>>s2;
			auto p=split(s2);
			if(role[s1].count(p.first)==0 || p.second>role[s1][p.first])
				//如果role里没有对应角色的权限,或者权限等级比之前的权限大,就更新对应的权限等级
				role[s1][p.first]=p.second;
		}
	}

	unordered_map<string,unordered_map<string,int>> user;//<用户,<权限名字,优先级>>
	cin>>a;
	while(a--) {
		cin>>s1>>b;
		while(b--) {
			cin>>s2;
			for(auto p:role[s2]) {//对role里每个角色所拥有的权限进行遍历,将role里的权限映射到user里 
				if(user[s1].count(p.first)==0 || p.second>user[s1][p.first])
					//如果user里没有对应的权限,或者权限等级比之前的权限大,就更新对应的权限等级
					user[s1][p.first]=p.second;
			}
		}
	}

	cin>>a;
	while(a--) {
		cin>>s1>>s2;
		auto p=split(s2);
		if(user.count(s1)==0 || user[s1].count(p.first)==0 || p.second>user[s1][p.first])
		//如果用户不存在,用户对应的权限不存在,用户的权限等级不够,就输出false 
			cout<<"false"<<endl;
		else if(user[s1][p.first]!=-1 && p.second==-1)
		//如果输入的权限不含等级,但权限有等级,就输出权限的等级 
			cout<<user[s1][p.first]<<endl;
		else
			cout<<"true"<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值