#include
#include
#include
using namespace std;
int main()
{
int p, n, t;
string temp, a, b, name;
unordered_map levels;//权限字典,记录权限名以及对应最高权限,最高权限为-1代表无等级权限
unordered_map> roles;//角色字典,记录角色名以及角色拥有的各个权限的最高等级
unordered_map> users;//人物字典,记录了人物以及人物对应的各种权限的最高等级
cin >> p;
while (p--) {//录入权限
cin >> temp;
if (temp.find(':') != temp.npos)
levels[temp.substr(0, temp.length() - 2)] = temp[temp.length() - 1] - 48;
else levels[temp] = -1;
}
cin >> p;
while (p--) {//录入角色,注意如果一个角色拥有数个相同的权限,取权限级别高的
cin >> a >> n;
while (n--) {
cin >> temp;
if (temp.find(':') != temp.npos) {
name = temp.substr(0, temp.length() - 2);
t = temp[temp.length() - 1] - 48;
if (roles[a].find(name) != roles[a].end() && t > roles[a][name] || roles[a].find(name) == roles[a].end())
roles[a][name] = t;
}
else roles[a][temp] = -1;
}
}
cin >> p;
while (p--) {//录入人物,同时将人物所拥有的各个角色的权限复制给人物,注意取最大值
cin >> a >> n;
while (n--) {
cin >> temp;
unordered_map::iterator iter = roles[temp].begin();
while (iter != roles[temp].end()) {
if (users[a].find(iter->first) == users[a].end()) users[a][iter->first] = iter->second;
else {
if (iter->second != -1 && iter->second > users[a][iter->first])
users[a][iter->first] = iter->second;
}
iter++;
}
}
}
cin >> p;
while (p--) {//进行查询
cin >> a >> b;
if (b.find(':') != b.npos) {//对于含权限级别的查询
name = b.substr(0, b.length() - 2);
t = b[b.length() - 1] - 48;//只有人物拥有该权限且等级大于等于查询等级时才真
if (users[a].find(name) != users[a].end() && users[a][name] >= t)
cout << "true" << endl;
else cout << "false" << endl;
}
else {//当查询的是无等级权限且存在于人物权限表时,才为真
if (levels[b] == -1 && users[a].find(b) != users[a].end()) cout << "true" << endl;
else if (users[a].find(b) != users[a].end())cout << users[a][b] << endl;//用户拥有该权限才输出权限值
else cout << "false" << endl;
}
}
return 0;
}