#include <iostream>
#include <sstream>
#include <vector>
#include <string>
using namespace std;
namespace fastio
{
const int bufl=1<<20;
const double base1[16]={1,1e-1,1e-2,1e-3,1e-4,1e-5,1e-6,1e-7,1e-8,1e-9,1e-10,1e-11,1e-12,1e-13,1e-14,1e-15};
const double base2[16]={1,1e1,1e2,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13,1e14,1e15};
struct IN{
FILE *IT;char ibuf[bufl],*is=ibuf,*it=ibuf;
IN(){IT=stdin;}IN(char *a){IT=fopen(a,"r");}
inline char getChar(){if(is==it){it=(is=ibuf)+fread(ibuf,1,bufl,IT);if(is==it)return EOF;}return *is++;}
template<typename Temp>inline void getInt(Temp &a){a=0;int b=0,c=getChar();while(c<48||c>57)b^=(c==45),c=getChar();while(c>=48&&c<=57)a=(a<<1)+(a<<3)+c-48,c=getChar();if(b)a=-a;}
template<typename Temp>inline void getDouble(Temp &a){a=0;int b=0,c=getChar(),d=0;__int128 e=0,f=0;while(c<48||c>57)b^=(c==45),c=getChar();while(c>=48&&c<=57)e=(e<<1)+(e<<3)+c-48,c=getChar();if(c==46){c=getChar();while(c>=48&&c<=57)d++,f=(f<<1)+(f<<3)+c-48,c=getChar();}a=e+base1[d]*f;if(b)a=-a;}
IN& operator>>(char &a){a=getChar();return *this;}
IN& operator>>(char *a){do{*a=getChar();}while(*a<=32);while(*a>32)*++a=getChar();*a=0;return *this;}
IN& operator>>(string &a){a.clear();char b=getChar();while(b<=32)b=getChar();while(b>32)a+=b,b=getChar();return *this;}
IN& operator>>(int &a){getInt(a);return *this;}
IN& operator>>(unsigned int &a){getInt(a);return *this;}
IN& operator>>(long long &a){getInt(a);return *this;}
IN& operator>>(unsigned long long &a){getInt(a);return *this;}
IN& operator>>(__int128 &a){getInt(a);return *this;}
IN& operator>>(float &a){getDouble(a);return *this;}
IN& operator>>(double &a){getDouble(a);return *this;}
IN& operator>>(long double &a){getDouble(a);return *this;}
};
struct OUT{
FILE *IT;char obuf[bufl],*os=obuf,*ot=obuf+bufl;int Eps;long double Acc;
OUT(){IT=stdout,Eps=6,Acc=1e-6;}OUT(char *a){IT=fopen(a,"w"),Eps=6,Acc=1e-6;}
inline void ChangEps(int x=6){Eps=x;}
inline void flush(){fwrite(obuf,1,os-obuf,IT);os=obuf;}
inline void putChar(int a){*os++=a;if(os==ot)flush();}
template<typename Temp>inline void putInt(Temp a){if(a<0){putChar(45);a=-a;}if(a<10){putChar(a+48);return;}putInt(a/10);putChar(a%10+48);}
template<typename Temp>inline void putLeading(Temp a,int b){if(!b)return;putLeading(a/10,b-1);putChar(a%10+48);}
template<typename Temp>inline void putDouble(Temp a){if(a<0){putChar(45);a=-a;}__int128 b=a;putInt(b);a-=b;a*=base2[Eps];b=a+Acc;putChar(46);putLeading(b,Eps);}
OUT& operator<<(char a){putChar(a);return *this;}
OUT& operator<<(char *a){while(*a>32)putChar(*a++);return *this;}
OUT& operator<<(string a){for(auto c:a)putChar(c);return *this;}
OUT& operator<<(int a){putInt(a);return *this;}
OUT& operator<<(long long a){putInt(a);return *this;}
OUT& operator<<(unsigned int a){putInt(a);return *this;}
OUT& operator<<(unsigned long long a){putInt(a);return *this;}
OUT& operator<<(__int128 a){putInt(a);return *this;}
OUT& operator<<(float a){putDouble(a);return *this;}
OUT& operator<<(double a){putDouble(a);return *this;}
OUT& operator<<(long double a){putDouble(a);return *this;}
~OUT(){flush();}
};
}
fastio::IN fin;
fastio::OUT fout;
long long n, m, x, y;
string form[105][105][105], form_name[105];
vector<string> split(string &text)//分割字符串
{
vector<string> columns;
istringstream txt(text);
string column;
while (getline(txt, column, ','))
{
columns.push_back(column);
}
return columns;
}
void find_column(string table_name, vector<string> column, string head, string xx)//查询并输出
{
long long first, second[105], third;
for (long long i = 0; i < n; i++)
{
if (form_name[i] == table_name)
{
first = i;
break;
}
}
for (long long i = 0; i < column.size(); i++)
{
for (long long j = 0; j < y; j++)
{
if (form[first][j][0] == column[i])
{
second[i] = j;
}
}
}
for (long long i = 0; i < y; i++)
{
if (form[first][i][0] == head)
{
third = i;
break;
}
}
for (long long i = 0; i < x; i++)
{
if (form[first][third][i] == xx)
{
for (long long j = 0; j < column.size(); j++)
{
fout << form[first][second[j]][x] << ' ';
}
fout << '\n';
}
}
return ;
}
void In()//表格的输入部分
{
fin >> n;
for (long long i = 0; i < n; i++)//第几个表
{
fin >> form_name[i] >> x >> y;
for (long long j = 0; j < x; j++)//第几行
{
for (long long k = 0; k < y; k++)//哪一项
{
fin >> form[i][j][k];
}
}
}
return ;
}
void Do()//寻找并输出
{
string columns, table_name, header, head, xx;
fin >> m;
for (long long i = 0; i < m; i++)
{
fin >> columns;//select
fin >> columns;//[columns]
fin >> table_name;//from
fin >> table_name;//[table_name]
fin >> header;//where
fin >> header;//[header]=x
head = header.substr(0, header.find('='));//[header]
xx = header.substr(header.find('=') + 1);//x
vector<string> column = split(columns);//{column_1, column_2, ..., column_n}
find_column(table_name, column, head, xx);//输出
}
return ;
}
int main()
{
In();
Do();
return 0;
}
中小模拟,没输出,有注释,求条。