ccf 权限查询

  * 用户 bob 具有 crm:1、git:2 和 game 权限
  * 用户 charlie 具有 git:3 和 game 权限
  * 用户 malice 未描述,因此不具有任何权限
评测用例规模与约定
  评测用例规模:
  * 1 ≤ p, r, u ≤ 100
  * 1 ≤ q ≤ 10 000
  * 每个用户具有的角色数不超过 10,每种角色具有的权限种类不超过 10
  约定:
  * 输入保证合法性,包括:
  1) 角色对应的权限列表(R 段)中的权限都是之前(P 段)出现过的,权限可以重复出现,如果带等级的权限重复出现,以等级最高的为准
  2) 用户对应的角色列表(U 段)中的角色都是之前(R 段)出现过的,如果多个角色都具有某一分等级权限,以等级最高的为准
  3) 查询(Q 段)中的用户名和权限类名不保证在之前(U 段和 P 段)出现过
  * 前 20% 的评测用例只有一种角色
  * 前 50% 的评测用例权限都是不分等级的,查询也都不带等级
思路:输入的权限在程序过程中是无用的,因为职位本身已经有了对应的权限,只需要把职位对应的权限存入相应的拥有该职位的人的名下,进行查询便可,注意输入和
一个人有两个职位,这两个职位对应相同权限不同等级的问题。

#include<bits/stdc++.h> 
using namespace std;
struct Quanxian{
	string s;
	int n=-1;
};
struct Jiaose{
	string s;
	int n;
	struct Quanxian quan[100];
	
};
struct Mingzi{
	string s;
	int n;
	vector<Quanxian> q;
};

int main(){
struct Quanxian quan[100];
struct Jiaose jiao[100];
struct Mingzi ming[100];
	int n1,n2,n3,n4;
	cin>>n1;
	string st;
	for(int i=0;i<n1;i++){
		cin>>st;
		int l=st.length();
		if(st[l-2]==':'){
			quan[i].n=st[l-1]-'0';
			quan[i].s=st.substr(0,l-2) ;
			
		}else
			quan[i].s=st;
	}
	cin>>n2;
	
	for(int i=0;i<n2;i++){
		cin>>jiao[i].s;
		cin>>jiao[i].n;
		for(int k=0;k<jiao[i].n;k++){
			cin>>st;
			int l=st.length();
			if(st[l-2]==':'){
				jiao[i].quan[k].n=st[l-1]-'0';
				jiao[i].quan[k].s=st.substr(0,l-2) ;
			
			}else
				jiao[i].quan[k].s=st;
			
			
		}
		
	}
	cin>>n3;
	for(int i=0;i<n3;i++){
		cin>>ming[i].s;
		cin>>ming[i].n;
		for(int k=0;k<ming[i].n;k++){
			cin>>st;
			for(int j=0;j<n2;j++){
				if((st==jiao[j].s)){
					for(int y=0;y<jiao[j].n;y++){
						ming[i].q.push_back(jiao[j].quan[y]);
					}
					break;
				}
			}
		}
		
	}
	cin>>n4;
	string st1;
	
	for(int i=0;i<n4;i++){
		cin>>st;
		int n=0;
		bool b=false;
		bool c=false;
		bool d=false;
		for(int k=0;k<n4;k++){
			if(st==ming[k].s){
				c=true;
				cin>>st1;
				int l=st1.length();
				if(st1[l-2]==':'){
					n=st1[l-1]-'0';
					st1=st1.substr(0,l-2);
					int tem=ming[k].q.size();
					for(int j=0;j<tem;j++){
						if(ming[k].q[j].s==st1){
							if(n<=ming[k].q[j].n){
								b=true;
								cout<<"true"<<endl;
								break;
							}
						}
					}
					if(!b){
						cout<<"false"<<endl;
					}
					
				}else{
					int tem=ming[k].q.size();
					for(int j=0;j<tem;j++){
						if(ming[k].q[j].s==st1){
						//	d=true;
							if(ming[k].q[j].n==-1){
								b=true;
								cout<<"true"<<endl;
								break;
							}else{
								if(ming[k].q[j].n>n){
									n=ming[k].q[j].n;
								}
							}
						}
			
					
					}
					if(!b){
						if(n!=0)
						cout<<n<<endl;
						else 
						cout<<"false"<<endl;
					}
				}
			
			}
			if(c)
				break;
		}
		if(!c)
			cout<<"false"<<endl;
	} 




	return 0;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值