#include #include #include #include #include #include struct TrieNode { struct TrieNode *children[26] = {nullptr, }; int cnt = 0; }; void insert(TrieNode *root, const std::string &key) { TrieNode *pCrawl = root; for (int i = 0; i < key.length(); i++) { int index = key[i] - 'a'; if (!pCrawl->children[index]) { pCrawl->children[index] = new TrieNode; } pCrawl = pCrawl->children[index]; ++pCrawl->cnt; } } int search(TrieNode *root, const std::string &key) { TrieNode *pCrawl = root; for (int i = 0; i < key.length(); i++) { int index = key[i] - 'a'; if (!pCrawl->children[index]) { return 0; } pCrawl = pCrawl->children[index]; } return pCrawl->cnt; } int n, q; TrieNode* pref = new TrieNode; TrieNode* suff = new TrieNode; int main() { freopen("wordstone.in","r",stdin); freopen("wordstone.out","w",stdout); std::ios::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL); std::cin >> n; std::string name; for (int i = 0; i < n; ++i) { std::cin >> name; insert(pref, name); std::reverse(name.begin(), name.end()); insert(suff, name); } std::cin >> q; std::cin >> name; int res = search(pref, name); std::reverse(name.begin(), name.end()); std::cout << (res + search(suff, name)); for (int i = 1; i < q; ++i) { std::cin >> name; res = search(pref, name); std::reverse(name.begin(), name.end()); std::cout << std::endl << (res + search(suff, name)); } }