#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
#define pb push_back
#define sz(a) (int)a.size()
#define all(a) begin(a),end(a)
using ll = long long;
using vi = vector<int>;
using ar2 = array<int,2>;
const int mxN = (int)1e4+10;
const ll LINF = (ll)1e17;
int n, m;
vi adj[mxN];
map<string, int> M;
set<string> cl[mxN];
string id[mxN];
bitset<mxN> T;
int dp[mxN][1667][2];
vector<string> words, realwords;
int par[mxN];
vector<string> classes[1667];
void decompose(string s, int ind){
	classes[ind].clear();
	for(int i = 0; i < sz(s); i++){
		if(s[i]=='.') continue;
		string word = "";
		while(i<sz(s) and s[i]!='.') word+=s[i],i++;
		if(word!="") classes[ind].pb(word);
	}
}
bool corresponds(int id, int _){
	for(auto c : classes[_])
		if(!cl[id].count(c)) return 0;
	return 1;
}
bool dfs(int s, int i, int t){
	if(!s) return 0; int p = par[s];
	if(!i) { 
		int ans = corresponds(s,i);
		if(t) return corresponds(s,i);
		return corresponds(s,i) or dfs(p,i,0); 
	}
	if(dp[s][i][t]!=-1) return dp[s][i][t];
	if(!t) return dp[s][i][0] = (dfs(s,i,1) or dfs(p,i,0));
	return dp[s][i][1] = (corresponds(s,i) and dfs(p,i-1,T[i]));
}
int main(){
	ios_base::sync_with_stdio(false); cin.tie(0);
	cin >> n; int ind = 1; stack<int> S;
	for(int i = 0; i < n; i++){
		string a, b, c; cin >> a;
		if(a!="</div>"){
			cin >> b; b = b.substr(4);
			b = b.substr(0,sz(b)-1);
			
			if(!M[b]) M[b] = ++ind;
			id[ind] = b;
			if(sz(S)) adj[S.top()].pb(ind), par[ind]=S.top();
			S.push(ind);
			string c="";
			bool ok = 1,stopp=0;
			while(!stopp){
				cin >> c;
				if(ok) c = c.substr(7),ok=0;
				if(c.back()=='>'){
					c = c.substr(0,sz(c)-2);
					stopp=1;
				}
				cl[ind].insert(c);
			}
		}
		else S.pop();
	}
	int q; cin >> q; cin.ignore(); 
	while(q--){
		string s; getline(cin,s);
		words.clear(); realwords.clear();
		memset(dp,-1,sizeof(dp)); T.reset();
		for(int i = 0; i < sz(s); i++){
			if(s[i]==' ') continue;
			string word = "";
			while(i<sz(s) and s[i]!=' ') word+=s[i],i++;
			if(word!="") words.pb(word);
		}
		for(auto u : words){
			if(u!=">") realwords.pb(u);
			else T[sz(realwords)]=1;
		}
		words.swap(realwords);
		vector<int> ans; ans.clear();
		for(int i = 0; i < sz(words); i++) decompose(words[i],i);
		for(int i = 1; i <= ind; i++)
			if(dfs(i,sz(words)-1,1)) ans.pb(i);
		cout << sz(ans) << " ";
		for(auto u : ans) cout << id[u] << " "; cout << "\n";
	}
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |