题意官网有,大致思路就是整一堆结构体,存起来 挨个查就行了

#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";
		}
		}
		
	}
}