#include <bits/stdc++.h>
using namespace std;
struct TrieNode {
bool is_nina = false, is_emilija = false;
TrieNode* children[26] = {nullptr};
};
class Trie {
public:
TrieNode* root;
Trie() { root = new TrieNode(); }
void insert(const string &word, bool is_nina) {
TrieNode* node = root;
for (char c : word) {
int index = c - 'a';
if (!node->children[index]) {
node->children[index] = new TrieNode();
}
node = node->children[index];
}
if (is_nina) node->is_nina = true;
else node->is_emilija = true;
}
};
unordered_map<TrieNode*, bool> memo;
bool isWinning(TrieNode* node) {
if (memo.count(node)) return memo[node];
bool canMove = false, hasLosingChild = false;
for (TrieNode* child : node->children) {
if (child) {
canMove = true;
if (!isWinning(child)) hasLosingChild = true;
}
}
return memo[node] = (canMove && hasLosingChild);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n;
Trie trie;
for (int i = 0; i < n; i++) {
string word;
cin >> word;
trie.insert(word, true);
}
cin >> m;
for (int i = 0; i < m; i++) {
string word;
cin >> word;
trie.insert(word, false);
}
cout << (isWinning(trie.root) ? "Nina" : "Emilija") << "\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |