CCF角色授权vector超时70分

分析

  1. 注意题目取值范围,考虑*
  2. 注意每次输入保证变量初始化,清空!
    vector会超时,建议用map更快

代码70

#include<iostream>
#include<vector>
using namespace std;
int n,m,q;//角色 关系关联 操作数量
class role {
	public:
		string role_name;//角色名称
		int nv;//操作数量
		vector<string> Do;//操作清单的操作
		int no;//资源种类的数量
		vector<string> Type;//资源种类
		int nn;//资源数量
		vector<string> thing;//资源名称
};
class relation { //关联
	public:
		string role_name;//角色名称
		int ns;//对应数量
		vector<string> which;//用户u 还是组g
		vector<string> user_name;// 对应用户名称
};
vector<role> roles;
vector<relation> relations;

string user_name;//用户/用户组的名称
int ng;//用户所属的用户组数量
string Do ;//用户指令的操作
string Type;//类型
string thing;//资源名称



int main() {
	ios::sync_with_stdio(false);
	cin>>n>>m>>q;//角色数量 角色关联数量 待检查的操作数量
	for(int i=0; i<n; i++) {
		role x;
		cin>>x.role_name>>x.nv;//操作数量
		for(int j=0; j<x.nv; j++) {
			string y;
			cin>>y;
			x.Do.push_back(y);
		}
		cin>>x.no;//资源种类数量
		for(int j=0; j<x.no; j++) {
			string y;
			cin>>y;
			x.Type.push_back(y);
		}
		cin>>x.nn;//资源名称数量
		for(int j=0; j<x.nn; j++) {
			string y;
			cin>>y;
			x.thing.push_back(y);
		}
		roles.push_back(x);
	}
	for(int i=0; i<m; i++) {
		relation x;
		cin>>x.role_name>>x.ns;
		for(int j=0; j<x.ns; j++) {
			string y,z;
			cin>>y>>z;
			x.which.push_back(y);
			x.user_name.push_back(z);
		}
		relations.push_back(x);
	}
	while(q--) {
		vector<string> can_role;//用户属于的角色名称 
		vector<string> group_user;//3. 用户属于的用户组名称
		cin>>user_name>>ng;
		for(int i=0; i<ng; i++) {
			string x;
			cin>>x;
			group_user.push_back(x);//用户组的名称
		}
		cin>>Do>>Type>>thing;
		for(int i=0; i<ng; i++) {//所有用户均有属于的用户组 ng!=0
			for(int j=0; j<m; j++) {
				for(int k=0; k<relations[j].ns; k++) {
					if((group_user[i]==relations[j].user_name[k]&&relations[j].which[k]=="g")
					        ||(user_name==relations[j].user_name[k]&&relations[j].which[k]=="u")
					  ) {
						can_role.push_back(relations[j].role_name);//相关联的角色
						break;
					}
				}
			}
		}

		int sign=0;
		for(int i=0; i<n; i++) {
			for(int j=0; j<can_role.size(); j++) {
				if(can_role[j]==roles[i].role_name) {//用户对应的角色
					sign=0; //赋初值
					for(int k=0; k<roles[i].nv; k++) {//操作这一关
						if(roles[i].Do[k]==Do||roles[i].Do[k]=="*") {//2.角色里有*
							sign=1;
							break;
						}
					}

					if(sign==1) {
						for(int  k=0; k<roles[i].no; k++) {//操作类型这一关
							if(roles[i].Type[k]==Type||roles[i].Type[k]=="*") {
								sign=2;
								break;
							}
						}

					}
					if(sign==2) {
						if(roles[i].nn==0) {//橘色资源名称*
							sign=3;
							cout<<"1"<<endl;
							break;
						} else {
							for(int k=0; k<roles[i].nn; k++) {
								if(roles[i].thing[k]==thing||roles[i].thing[k]=="*") {
									sign=3;
									cout<<"1"<<endl;
									break;
								}
							}
						}
					}
					if(sign==3)
						break;
				}
				if(sign==3)
					break;
			}
			if(sign==3)
				break;
		}
		if(sign!=3)
			cout<<"0"<<endl;
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MORE_77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值