Trie 树爆大0
#include <bits/stdc++.h>
using namespace std;
int idx(char x){
return x-'a';
}
int ch[1000005][30],xs[1000005][30],t;
int cnt[1000005];
char qwq[1000005];
int czmg=0;
void insert(int q){
int u=0;
int len=strlen(qwq);
for (register int i=0;i<len;i++){
int c=idx(qwq[i]);
if (!ch[u][c]) ch[u][c]=++czmg;
u=ch[u][c];
}
xs[u][q]=1;
}
void find(){
bool ok=0;
int u=0;
int len=strlen(qwq);
for (register int i=0;i<len;i++){
int c=idx(qwq[i]);
if (!ch[u][c]){
ok=1;
break;
}
u=ch[u][c];
}
if (!ok)
for (register int i=1;i<=t;i++) if (xs[u][i]) cout << i << ' ';
cout << endl;
}
int main(){
cin >> t;
for (register int i=1;i<=t;i++){
int q;
cin >> q;
for (register int j=1;j<=q;j++){
cin >> qwq;
insert(i);
}
}
int p;
cin >> p;
while(p--){
cin >> qwq;
find();
}
}