题意官网有,大致思路就是整一堆结构体,存起来 挨个查就行了
#include <bits/stdc++.h>
using namespace std;
struct qx{
string name;
int level = 0;
};
struct js{
string name;
vector<qx> jqx;
};
struct user{
string name;
vector<js> ujs;
};
int p,r,u,num;
vector<qx> mqx;
vector<js> mjs;
vector<user> muser;
void Init_qx(qx &temp,string &s){
int pos= s.find(':');
if(pos != string::npos){
int t = s.find(':') + 1;
temp.level = s[t]-'0';
temp.name = s.substr(0,pos);
}
else{
temp.level = -1;
temp.name = s;
}
}
int find_js(string name){
for(int i = 0; i < mjs.size(); i++)
if(mjs[i].name == name) return i;
return -1;
}
int find_user(string name){
for(int i = 0; i < muser.size(); i++)
if(muser[i].name == name) return i;
return -1;
}
int find_(user &temp, qx &quxi){
for(int i = 0; i < temp.ujs.size(); i++){
for(int j = 0; j < temp.ujs[i].jqx.size(); j++){
if(temp.ujs[i].jqx[j].name == quxi.name &&
temp.ujs[i].jqx[j].level >= quxi.level)
return 1;
}
}
return 0;
}
int main(){
//freopen("1.txt","r",stdin);
cin >> p;
string s;
for(int i = 0; i < p; i++){
cin >> s;qx temp;
Init_qx(temp,s);
mqx.push_back(temp);
}
cin >> r;
for(int i = 0; i < r; i++){
js jtemp;
qx qtemp;
cin >> jtemp.name >> num;
while(num--){
cin >> s;
Init_qx(qtemp,s);
jtemp.jqx.push_back(qtemp);
}
mjs.push_back(jtemp);
}
cin >> u;
for(int i = 0; i < u; i++){
user utemp;
js jtemp;
string name;
cin >> utemp.name >> num;
while(num--){
cin >> name;
utemp.ujs.push_back(mjs[find_js(name)]);
}
muser.push_back(utemp);
}
int cha; cin >> cha;
while(cha--){
string name;
qx quxi;
cin >> name >> s;
bool flag = false;
if(s.find(':') != string::npos) flag = true;
user temp;
int ttemp = find_user(name);
if(ttemp == -1){
cout << "false\n";
continue;
}
else{
temp = muser[ttemp];
Init_qx(quxi,s);
if(flag == false){
int n = -2;
for(int i = 0; i < temp.ujs.size(); i++){
for(int j = 0; j < temp.ujs[i].jqx.size(); j++){
if(temp.ujs[i].jqx[j].name == quxi.name){
quxi.level = max(temp.ujs[i].jqx[j].level,quxi.level);
n = quxi.level;
}
}
}
if(n == -2) cout << "false\n";
else if(n == -1) cout << "true\n";
else cout << n << "\n";
}
else{
if(find_(temp,quxi)) cout << "true\n";
else cout << "false\n";
}
}
}
}