CCF 权限查询

记录一下,不知道为什么0分

#include<bits/stdc++.h>

using namespace std;

typedef struct
{
	string A_name;	 //权限名 
	int level; 		 //权限等级 
}Authority;			 //权限结构 

typedef struct
{
	string R_name; 				//角色名 
	int R_nums;					//该角色所具有的权限
	Authority privilege[11];    //可以存放多个权限,最多10个 
}Rols; //角色结构,权限数量不确定 
 
typedef struct
{
	string U_name;			//用户名 
	int    U_nums;		    //用户所具有权限个数 
	Rols   U_rols[11];      //用户所具有的权限名 
}User;//用户结构 

//数据限制,用户、角色、权限均不会超过100 
Authority author[101];
Rols rols[101];
User user[101];

int FindRole(string name) //查找是否存在角色 
{
	for (int i = 0; i < 100; i++)
	{
		if (rols[i].R_name == name)
		{
			return i;
		}
	}
	return -1;
}

int FindUser(string name) //查找否存在用户 
{
	for (int i = 0; i < 100; i++)
	{
		if (name == user[i].U_name)
		{
			return i;
		}
	}
	return -1;
}

int main()
{ 
	int p;
	cin >> p;
	string Instr;
	
	for (int i = 0; i < p; i++)
	{
		cin >> Instr;
		if (Instr.find(":") != string::npos)//有等级权限 
		{
			int pos = Instr.find(":");
			author[i].A_name = Instr.substr(0,pos);	
			author[i].level = Instr[pos + 1] - '0';
		}
		else
		{
			author[i].A_name = Instr;
			author[i].level = -1; //没有权限 
		}	
	}
	/***************权限输入正确****************/ 
	
	int r;
	cin >> r;
	string Instr2;
	
	for (int i = 0; i < r; i++)
	{
		cin >> rols[i].R_name >> rols[i].R_nums;
		
		for (int j = 0; j < rols[i].R_nums; j++)
		{
			cin >> Instr2;
			if (Instr2.find(":") != string::npos)//有等级权限 
			{
				int pos = Instr2.find(":");
				rols[i].privilege[j].A_name = Instr2.substr(0,pos);
				rols[i].privilege[j].level = Instr2[pos + 1] - '0';
			}
			else
			{
				rols[i].privilege[j].A_name = Instr2;
				rols[i].privilege[j].level = -1;
			}
		}
	} 
	/**********************角色输入正确*******************************/
	
	int u;
	cin >> u;
	string Instr3;
	
	for (int i = 0; i < u; i++)
	{
		cin >> user[i].U_name >> user[i].U_nums;
		for (int j = 0; j < user[i].U_nums; j++)
		{
			cin >> Instr3;
			user[i].U_rols[j] = rols[FindRole(Instr3)]; 
		}
	}
	/********************用户输入正确**********************/
	 
	//权限查询部分
	int q;
	cin >> q;
	string F_name; //所查询的名字 
	string F_pre;  //所查询的权限 
	
	for (int i = 0; i < q; i++)
	{
		cin >> F_name;
		cin >> F_pre;
		int pre_flag = 0;		//确定是否有权限 
		int Max_level = -1;		//所查权限将具有的最高权限
		
		if (FindUser(F_name) != -1)//存在该用户 
		{
			User F_u = user[FindUser(F_name)] ;
			for (int j = 0; j < F_u.U_nums; j++) //遍历用户查找角色
			{
				for (int k = 0; k < F_u.U_rols[j].R_nums; k++) //遍历角色查找权限 
				{
					Authority F_a;
					if (F_pre.find(":") != string::npos)//有等级权限 
					{
						int pos = F_pre.find(":");
						F_a.A_name = F_pre.substr(0,pos);	
						F_a.level = F_pre[pos + 1] - '0';
					}
					else
					{
						F_a.A_name = F_pre;
						F_a.level = -1; //没有权限 
					}	 
					
					if (F_a.A_name == F_u.U_rols[j].privilege[k].A_name)//若权限名称满足
					{
						//不分等级权限的不分等级查询 
						if (F_u.U_rols[j].privilege[k].level == -1 && F_a.level == -1)
						{
							pre_flag = 1;
						} 
						//分等级权限的不分等级查询 
						else if (F_u.U_rols[j].privilege[k].level != -1 && F_a.level == -1) 
						{
							if (Max_level < F_u.U_rols[j].privilege[k].level)
							{
								pre_flag = 1;
								Max_level = F_u.U_rols[j].privilege[k].level;
							}
						}
						//分等级权限的分等级查询
						else if (F_u.U_rols[j].privilege[k].level != -1 && F_a.level != -1)
						{
							if (F_a.level <= F_u.U_rols[j].privilege[k].level)
							{
								pre_flag = 1;
							}
						} 
					} 
				} 
			}
		} 	
		//输出部分
		
		if (pre_flag == 1 && Max_level != 1)
		{
			cout << Max_level << endl;
		} 
		else if (pre_flag == 1 && Max_level == -1)
		{
			cout << "true" << endl;
		}
		else if (pre_flag == 0)
		{
			cout << "false" << endl;
		}
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值