https://www.luogu.com.cn/problem/P3879
思路
直接用trie树模板
代码
#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
class Trie {
private:
bool isEnd;
Trie *next[26];
public:
/** Initialize your data structure here. */
Trie() {
isEnd = false;
memset(next, 0, sizeof(next));
}
/** Inserts a word into the trie. */
void insert(string word) {
Trie *node = this;
for (int i = 0; i < word.length(); i++) {
if (node -> next[word[i] - 'a'] == NULL) {
node -> next[word[i] - 'a'] = new Trie();
}
node = node -> next[word[i] - 'a'];
}
node -> isEnd = true;
}
/** Returns if the word is in the trie. */
bool search(string word) {
Trie *node = this;
for (int i = 0; i < word.length(); i++) {
node = node -> next[word[i] - 'a'];
if (!node) return false;
}
return node -> isEnd;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
bool startsWith(string prefix) {
Trie *node = this;
for (int i = 0; i < prefix.length(); i++) {
node = node -> next[prefix[i] - 'a'];
if (!node) return false;
}
return true;
}
};
int n, m, k;
Trie *passage[1001];
int main() {
//freopen("in.txt", "r", stdin);
cin >> n;
for (int i = 0; i < n; i++) {
passage[i] = new Trie();
string s;
cin >> k;
for (int j = 0; j < k; j++) {
cin >> s;
//cout << s << endl;
passage[i] -> insert(s);
}
}
cin >> m;
for (int i = 0; i < m; i++) {
string s;
cin >> s;
int num = 0;
int a[1001] = {0};
for (int j = 0; j < n; j++) {
if (passage[j] -> search(s)) {
a[++num] = j + 1;
}
}
for (int j = 1; j < num; j++) {
cout << a[j] << " ";
}
if (num) cout << a[num];
cout << endl;
}
return 0;
}