题目链接:计算机软件能力认证考试系统
思路见注释。
#include<iostream>
#include<map>
#include<set>
#include<vector>
#include<queue>
using namespace std;
//需要把用户和用户组都看作用户
struct j
{
set<string>cz;//操作
set<string>zzl;//资源类型
set<string>zmc;//资源名称
};//存放角色属性的结构体
map<string,j>jue;//角色名对于相应的结构体
typedef set<string> lian;//角色库,存放每个用户/(组)所关联的角色
map<string,lian>user;//用户名对应关联的角色库
int n,m,q;
int nv,no,nn,ns,ng;
string czm,zzlm,zmcm;//保存输入的待查询的名称、资源种类、资源名称
bool judge(string name)
{
lian jsk=user[name];//用户名对应的角色库
for(auto it=jsk.begin();it!=jsk.end();it++)//取用户名关联的角色逐个判断
{
string jname=*it;//库里的角色名
if(jue[jname].cz.count(czm)||jue[jname].cz.count("*"))
{
if(jue[jname].zzl.count(zzlm)||jue[jname].zzl.count("*"))
if(jue[jname].zmc.count(zmcm)||jue[jname].zmc.empty())
{
return true;//找到一个关联的角色能完成操作
}
}
}
return false;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m>>q;
for(int i=0;i<n;i++)//录入角色信息
{
string name,st;
cin>>name;
cin>>nv;
while(nv-->0)
{
cin>>st;
jue[name].cz.insert(st);
}
cin>>no;
while(no-->0)
{
cin>>st;
jue[name].zzl.insert(st);
}
cin>>nn;
while(nn-->0)
{
cin>>st;
jue[name].zmc.insert(st);
}
}
for(int i=0;i<m;i++)//用户与用户组一视同仁,为每个用户录入其关联的角色库
{
string name,uname;
cin>>name;//将关联的角色名
cin>>ns;
while(ns-->0)
{
cin>>uname;cin>>uname;//用户名
user[uname].insert(name);
}
}
for(int i=0;i<q;i++)
{
bool fg=false;
queue<string> lie;//用户(名)列表
string name;
cin>>name>>ng;
lie.push(name);
while(ng-->0)
{
cin>>name;
lie.push(name);
}
//存列表,之后逐个judge是否能完成操作
cin>>czm>>zzlm>>zmcm;
while(!lie.empty())//用户名逐个取出判断
{
if(judge(lie.front()))//能完成操作
{
fg=true;
cout<<1<<endl;
break;
}
lie.pop();
}
if(!fg) cout<<0<<endl;//不能完成操作
}
}
第一次写文章,努力熟悉STL。