分析
- 注意题目取值范围,考虑*
- 注意每次输入保证变量初始化,清空!
用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;
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;
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++) {
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]=="*") {
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;
}
}