CCF 201612-3 权限查询 100分

Posted 登登登ccc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

以上是关于CCF 201612-3 权限查询 100分的主要内容,如果未能解决你的问题,请参考以下文章

CCF 201612-3 权限查询 100分

CCF-权限查询-201612-3

*CCF 201612-3.1 权限查询 试题

CCF-201612-3 -权限查询

CCF201703-5 引水入城(100分题解链接)

CCF_201612-3_炉石传说