#5以后全RE。
记录
#include<bits/stdc++.h>
using namespace std;
long long n,m,l,last,table,_head,cnt,x[12],y[12];
string tmp,data[12][12][12],real_[100],xx,columns,table_name,header;
map<string,int>name,head[12];// 将表名/表头映射成数字
int main() {
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;
// 1.输入表
for(int i=1;i<=n;++i) {
cin>>tmp>>x[i]>>y[i];
name[tmp]=i;// 表示第tmp张表是第i张
for(int j=1;j<=y[i];++j) {
cin>>tmp;
head[i][tmp]=j;// 表示第i张表中名为tmp的表头是第j个表头
}
for(int j=1;j<x[i];++j)
for(int k=1;k<=y[i];++k)
cin>>data[i][j][k];// 表示第i张表中第k个表头下第j个数据
}
cin>>m;
for(int i=1;i<=m;++i) {
// 2.输入语句
columns=table_name=header="";
cin>>tmp>>columns;
cin>>tmp>>table_name;
cin>>tmp>>header;
// 3.将 = 两边分开
l=header.length();
for(int j=0;j<l;++j) {
if(header[j]=='=') {
xx=header.substr(j+1,l);// xx是此轮查找的关键字
header=header.substr(0,j);
break;
}
}
// 4.处理逗号隔开的表头
l=columns.length();
last=0,cnt=0;
for(int j=0;j<l;++j) {
if(columns[j]==',') {
real_[cnt++]=columns.substr(last,j);// cnt记录输出表头数, real记录cnt个表头
last=j+1;// 截取的子串的起点
}
}
real_[cnt++]=columns.substr(last,l);// 最后一个
// 5.输出
table=name[table_name];
_head=head[table][header];
for(int j=1;j<=x[table];++j)
if(data[table][j][_head]==xx) {
for(int k=0;k<cnt;++k) cout<<data[table][j][head[table][real_[k]]]<<' ';
// 第table张表中第head[table][real_[k]]个表头下第j个数据
cout<<endl;
}
}
return 0;
}