2022-06-03CCFCSP第三题角色授权(80分超时的进)-创新互联

大模拟,只要会用复杂一点的数据结构,就没问题。
同时要注意超时问题,我一开始用的全都是vector就嗯顺序遍历搜操作、资源种类和资源清单,很自然地超时了,,后来全都换成set,之后直接.count(),又省事又快!

创新互联建站主要从事成都做网站、网站设计、网页设计、企业做网站、公司建网站等业务。立足成都服务三元,十多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792
#include#include#include#includeusing namespace std;
#pragma GCC optimize(2)


struct User{string name;
	setop;
	setcat;
	setlist;
};
// 记录某些用户或组关联了哪些角色
// 实际上组和用户没必要区分,统一看作用户
unordered_map>to_users;

int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int n, m, q;
	cin >>n >>m >>q;
	vectorusers(n);
	// Users
	string tmp;
	for(int i = 0; i< n; i ++){cin >>tmp;
		users[i].name = tmp;
		int nv, no, nn;
		// operations
		cin >>nv;
		while(nv--){	cin >>tmp;
			users[i].op.insert(tmp);
		}
		// category
		cin >>no;
		while(no--){	cin >>tmp;
			users[i].cat.insert(tmp);
		}
		// list
		cin >>nn;
		while(nn--){	cin >>tmp;
			users[i].list.insert(tmp);
		}
	}
	// 将用户或组绑定已有的角色
	while(m--){// 
		cin >>tmp;
		int idx = -1;
		for(int i = 0; i< users.size(); i ++){	if(users[i].name == tmp){		idx = i;
				break;
			}
		}
		
		int ns;
		cin >>ns;
		string t1, t2;
		while(ns--){	cin >>t1 >>t2;
			// push_back的是角色在users数组中的下标
			// 把用户和组都看做成用户,不区分身份,因此t1没用
			to_users[t2].push_back(idx);
		}
	}
	
	while(q--){cin >>tmp;
		int ng;
		cin >>ng;
		vectorgroup;
		// 加入关联的用户组(包含自己以及关联的用户和组)
		group.push_back(tmp);
		while(ng--) {	cin >>tmp;
			group.push_back(tmp);
		}
		// check tmp1 tmp2 tmp3
		string tmp1, tmp2, tmp3;
		cin >>tmp1 >>tmp2 >>tmp3;
		bool flag1 = false, flag2 = flag1, flag3 = flag1;
		// 之后就是看组中这些用户关联的角色们是否有权限了
		// 满足一个就break,否则就重置三个flag
		for(int i = 0; i< group.size(); i ++){	int n = to_users[group[i]].size();
			
			for(int j = 0; j< n; j ++){		if(users[to_users[group[i]][j]].op.count(tmp1) || users[to_users[group[i]][j]].op.count("*")) 
					flag1 = true;
				
				
				if(users[to_users[group[i]][j]].cat.count(tmp2) || users[to_users[group[i]][j]].cat.count("*")) 
					flag2 = true;
				
				if(users[to_users[group[i]][j]].list.size() == 0) flag3 = true;
				else{if(users[to_users[group[i]][j]].list.count(tmp3))
						flag3 = true;
				}

				if(flag1 && flag2 && flag3) break;
				else{flag1 = false;
					flag2 = flag1;
					flag3 = flag1;
				}
			}
			
			if(flag1 && flag2 && flag3) break;
		}
		
		if(flag1 && flag2 && flag3) cout<< 1<< endl;
		else cout<< 0<< endl;
	}
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文题目:2022-06-03CCFCSP第三题角色授权(80分超时的进)-创新互联
文章源于:http://scyanting.com/article/cooigi.html