按理说trie应该开到5e6但实际上只开到1e6就过掉了,而且洛谷的空间评判似乎有点问题,1e6*26的大小差不多有100mb但是洛谷只显示了40多mb,在codeforces上的机子上跑同样的代码显示的都是11000KB
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
const int M=1e6+10;
int son[M][26];
int j;
vector<int> cnt[M];
void insert(string s,int x){
int p=0;
for(int i=0;i<(int)s.size();i++){
int u=s[i]-'a';
if(!son[p][u]) son[p][u]=++j;
p=son[p][u];
}
cnt[p].push_back(x);
}
vector<int> query(string s){
int p=0;
vector<int> b;
for(int i=0;i<(int)s.size();i++){
int u=s[i]-'a';
if(!son[p][u]) return b;
p=son[p][u];
}
return cnt[p];
}
void solved(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
int m;
cin>>m;
for(int j=1;j<=m;j++){
string s;
cin>>s;
insert(s,i);
}
}
int m;
cin>>m;
while(m--){
string s;
cin>>s;
vector<int> p=query(s);
set<int> d;
for(int k:p) d.insert(k);
for(int k:d) cout<<k<<" ";
cout<<endl;
}
}
int main(){
ios::sync_with_stdio(false);
cout.tie(0);
cin.tie(0);
int t=1;
while(t--){
solved();
}
}