思路:使用exist来标记单词结尾,最后输出标记,标记是句子编号
直接使用bool 数组会爆空间,考虑bitset;
(模板题)
#include <bits/stdc++.h>
using namespace std;
const int N = 500010;
int son[N][26], idx = 0, n;
char str[5010];
bitset<1000> exist[500010];
inline void insert(char str[], int x) {
int p = 0, len = strlen(str);
for (int i = 0; i < len; i++) {
int u = str[i] - 'a';
if (!son[p][u])
son[p][u] = ++idx;
p = son[p][u];
}
exist[p][x] = 1;
return;
}
inline void query(char str[]) {
int p = 0, len = strlen(str), flag = 0;
for (int i = 0; i < len; i++) {
int u = str[i] - 'a';
if (!son[p][u]) {
flag = 1;//没有这个单词
break;
}
p = son[p][u];
}
if (!flag) {
for (int i = 1; i <= n; i++) {
if (exist[p][i]) {//输出标记
cout << i << " ";
}
}
cout << endl;
}
return;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
for (int j = 1; j <= x; j++) {
scanf("%s", str);
insert(str, i);
}
}
int m;
cin >> m;
for (int i = 1; i <= m; i++) {
scanf("%s", str);
query(str);
}
return 0;
}