【题意分析】
很裸的一道trie啊,权当复习了
读入时就一个一个插入trie里面,然后就是查询这个单词是不是出现过
由于可能会爆内存,bool数组用bitset就好了
Code:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <bitset>
#include <algorithm>
#define MAXN 300005
using namespace std;
bitset <1002> mark[MAXN];
int tree[MAXN][27], n, sz;
inline int read () {
register int s = 0, w = 1;
register char ch = getchar ();
while (! isdigit (ch)) {if (ch == '-') w = -1; ch = getchar ();}
while (isdigit (ch)) {s = (s << 3) + (s << 1) + (ch ^ 48); ch = getchar ();}
return s * w;
}
inline void insert (char *s, int k) {
int len = strlen (s + 1), now = 0;
for (register int i = 1; i <= len; i++) {
int pos = s[i] - 'a';
if (! tree[now][pos]) tree[now][pos] = ++sz;
now = tree[now][pos];
}
mark[now][k] = 1;
}
inline void query (char *s) {
int len = strlen (s + 1), now = 0;
bool flag = 1;
for (register int i = 1; i <= len; i++) {
int pos = s[i] - 'a';
if (! tree[now][pos]) {flag = 0; break;}
now = tree[now][pos];
}
if (flag)
for (register int i = 1; i <= n; i++) if (mark[now][i]) printf ("%d ", i);
puts ("");
}
int main () {
n = read ();
for (register int i = 1; i <= n; i++) {
int m = read (); char s[30];
for (register int j = 1; j <= m; j++) {
scanf ("%s", s + 1);
insert (s, i);
}
}
int q = read ();
for (register int I = 1; I <= q; I++) {
char s[30]; scanf ("%s", s + 1);
query (s);
}
return 0;
}