第三题:
题干:角色授权
#include <bits/stdc++.h>
using namespace std;
struct Character_Class{//角色的能力
string name;
map<string,int> opt;//操作清单
map<string,int> zz;//资源种类清单
map<string,int> zm;//资源名称清单
}Character[600];
map<string,int> name_CID;
map<string,vector<int> > Uname_CID;
int n,m,q;
int nv,no,nn,ns,ng;
string s;
string uname;
string ugroup[500];
string wopt,wzz,wzm;
bool check(int cid,string o,string z,string m){
if((Character[cid].opt.count(o)&&Character[cid].opt[o]==1)||
(Character[cid].opt.count("*")&&Character[cid].opt["*"]==1)){
if((Character[cid].zz.count(z)&&Character[cid].zz[z]==1)||
(Character[cid].zz.count("*")&&Character[cid].zz["*"]==1)){
if((Character[cid].zm.count(m)&&Character[cid].zm[m]==1)||
(Character[cid].zm.size()==0)){
return 1;
}
}
}
return 0;
}
signed main()
{
cin>>n>>m>>q;
for(int i=1;i<=n;i++){
cin>>Character[i].name;
name_CID[Character[i].name]=i;
cin>>nv;
for(int j=1;j<=nv;j++){
cin>>s;
Character[i].opt[s]=1;
}
cin>>no;
for(int j=1;j<=no;j++){
cin>>s;
Character[i].zz[s]=1;
}
cin>>nn;
for(int j=1;j<=nn;j++){
cin>>s;
Character[i].zm[s]=1;
}
}
for(int i=1;i<=m;i++){
cin>>s;
int CID=name_CID[s];
cin>>ns;
for(int j=1;j<=ns;j++){
cin>>s;
cin>>s;
Uname_CID[s].push_back(CID);
}
}
for(int i=1;i<=q;i++){
cin>>uname;
cin>>ng;
for(int j=1;j<=ng;j++){
cin>>ugroup[j];
}
cin>>wopt>>wzz>>wzm;
int flag=0;
for(int j=0;j<Uname_CID[uname].size();j++){
int id=Uname_CID[uname][j];
if(check(id,wopt,wzz,wzm)){
flag=1;
break;
}
}
if(!flag){
for(int j=1;j<=ng;j++){
if(flag) break;
for(int k=0;k<Uname_CID[ugroup[j]].size();k++){
int id=Uname_CID[ugroup[j]][k];
if(check(id,wopt,wzz,wzm)){
flag=1;
break;
}
}
}
}
cout<<flag<<endl;
}
}