CCF-CSP 201612-3权限查询 大模拟 字符串处理

题目链接

模拟思路:

map<string,set<PRE>> role,user; 用map存角色和用户的权限
PRE结构体如下:
PRE(string nn,int ll)
	{
		name=nn; //
		level=ll; //不分权限等级权限为-1
	}	

首先对于role,遍历该role的权限,不分权限等级权限直接push到set里面,如果是带等级权限,如果未找到,直接push,否则选择更大的level,没有则不更新

其次对于user,遍历用户权限,思路和role差不多
查找思路也很简单,可见代码注释

注意:
1.string的find函数找到了返回该字符在字符串的下标,否则返回-1
map和set的find函数找到了返回迭代器(用*it)可以访问,否则返回xx.end
2.注意mutable的使用,不加mutable,定义set,如果用iterator访问,则数据无法修改,见10行和69行
3.set,map的find结构体的话,会根据重载符号查找,见19行和main函数中的find函数。

#include<iostream>
#include<string>
#include<map>
#include<set>
using namespace std;


struct PRE{
	string name;
	mutable int level; //定义set,如果用iterator访问,不加mutable,数据无法修改 
	
	PRE(string nn,int ll)
	{
		name=nn;
		level=ll;
	}	
	
	bool operator<(const PRE & pp) const{ //  set/map查找只查询PRE(name,level) 中的name ,无论level是否相等,只要name相同则返回该iterator(也可以自己重新定义) 
		return name<pp.name; 
	}
};

map<string,set<PRE>> role,user;


int main()
{
	string ss;
	int p,r,u,q;
	cin>>p;
	
	for(int i=0;i<p;i++)  //前一段数据其实没什么用 
		cin>>ss;
	
	cin>>r;          //加入role的权限 
	for(int i=0;i<r;i++)
	{
		string role_n;
		cin>>role_n;
		
		int num;
		cin>>num;
		
		for(int k=1;k<=num;k++)
		{
			string ss;
			cin>>ss;
			
			int xb=ss.find(':');
			if(xb==-1)   //
			{
				role[role_n].insert(PRE(ss,-1));
			}else{
				
				string name;
				int level;
				
				name=ss.substr(0,xb);
				level=ss[ss.size()-1]-'0';
				
				auto p=PRE(name,level);
				
				auto tt=role[role_n].find(p);
				
				if(tt==role[role_n].end())  
				{
					role[role_n].insert(PRE(name,level));
				}else{
					(*tt).level=max(level,(*tt).level);   //这里体现了Mutable 
				}
			}
		}
	} 
	
	cin>>u;        //加入用户user的权限 
	
	for(int i=1;i<=u;i++)
	{
		string user_n;
		cin>>user_n;
		
		int num;
		cin>>num;
		
		
		for(int k=1;k<=num;k++)
		{
			string ro_name;
			cin>>ro_name;
			
			for(auto tt:role[ro_name])
			{
				PRE t(tt.name,tt.level);
				if(user[user_n].find(t)==user[user_n].end())
				{

					user[user_n].insert(t);
				}else{
					auto ss=user[user_n].find(t);
			
					(*ss).level=max((*ss).level ,t.level);
				}
			}
		
		}
		
	}
	
	cin>>q;        //开始查询 
	
	for(int i=1;i<=q;i++)
	{
		string check_n;
		cin>>check_n;
		
		string str;
		cin>>str;
		
		string name;
		int level=-1;
		
		if(str.find(':')!=-1)
		{
			name=str.substr(0,str.find(':'));
			level=str[str.size()-1]-'0';
			
		}else name=str;
		
		PRE pp(name,level);
		
		auto tt=user[check_n].find(pp);
		
		if(tt==user[check_n].end())    //user名字都找不到直接返回false 
		{
			cout<<"false";
		}else{
			if((*tt).level==-1)  //如果是不带等级权限的权限 直接说明找到了 
				cout<<"true"; 
			else{                 //否则都是带等级权限 
				if(level==-1)    //如果带等级权限但输入查询权限字符未带等级,输出权限等级 
					cout<<(*tt).level;
				else {
					if((*tt).level>=level)  //最后一种  比较等级大小即可 
						cout<<"true";
					else cout<<"false";
				}
			}	
			
		}
		cout<<endl;
	}
	
	
	return 0;
}

版权声明:本文为weixin_45448563原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。