trie写法,样例过全RE
#include<bits/stdc++.h>
using namespace std;
int trie[500010][127];
vector<int> final[500010];//以这个点结束的单词
int cnt=1;
void add(string s,int id) { //文章id
int pos=1;
for(int i=0; i<s.length(); i++) {
//s[i]-='a';
if(trie[pos][s[i]-'a']) {
} else {
trie[pos][s[i]-'a']=++cnt;
}
pos=trie[pos][s[i]-'a'];
if(i==s.length()-1) {
if(final[pos].size()>0) {
if(final[pos][final[pos].size()-1]!=id)
final[pos].push_back(id);
} else {
final[pos].push_back(id);
}
}
}
}
void query(string s) {
int pos=1;
for(int i=0; i<s.length(); i++) {
if(trie[pos][s[i]-'a']) {
} else {
cout<<0<<'\n';
return;
}
pos=trie[pos][s[i]-'a'];
if(i==s.length()-1) {
for(int i=0; i<final[pos].size()-1; i++) {
cout<<final[pos][i]<<' ';
}
if(final[pos].size()>0) {
cout<<final[pos][final[pos].size()-1]<<'\n';
} else {
cout<<"0\n";
}
}
}
}
int main() {
int n;
cin>>n;
for(int i=1; i<=n; i++) {
int l;
cin>>l;
for(int j=1; j<=l; j++) {
string s;
cin>>s;
add(s,i);
}
}
int m;
cin>>m;
for(int i=1; i<=m; i++) {
string s;
cin>>s;
query(s);
}
return 0;
}