This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
const int mxN = 2e5+1;
vector<vector<array<int,3>>> nxt(mxN, vector<array<int,3>>(26));
//vector<bool> Nina winning(mxN);
bool dfs(int node, int depth)
{
    int par = (depth & 1);
    //cout << "I am " <<(par ? "Nina" : "Emilija") << " at starting depth " << depth << "\n";    
    bool res = !par;
    bool noMove = true;
    for (int i = 0; i < 26; ++i)
    {
        array<int,3>& p = nxt[node][i];
        noMove &= (p[0] == 0 || p[2 - par] == 0);
        if (p[0] != 0 & p[2-par])
        {
            //cout << "I am " << (par ? "Nina" : "Emilija") << " at following depth " << depth << ", char: [" << (char)('a' + i) << " " << p[0] << " " << p[1] << " " << p[2] << "]\n";
            bool neigRes = dfs(p[0], depth+1);
            //cout << "I am " << (par ? "Nina" : "Emilija") << " at returning depth " << depth << ", char: [" << (char)('a' + i) << " " << p[0] << " " << p[1] << " " << p[2] << "] Nina winning: " << neigRes << "\n";
            if (par)
                res |= neigRes;
            else
                res &= neigRes;
        }
    }
    if (noMove)
    {
        res = !par;
        //cout << "I am " << (par ? "Nina" : "Emilija") << " at noMove depth " << depth << ", Nina winning: " << res << "\n";
    }
    //cout << "I am " << (par ? "Nina" : "Emilija") << " at terminating depth " << depth << ", Nina winning: " << res << "\n";
    
    return res;
}
int main() 
{
	int n; cin >> n;
    string s;
    
    int MAXID = 0;
    while(n--)
    {
        cin >> s;
        int node = 0;
        for (char c : s)
        {
            array<int,3>& p = nxt[node][c-'a'];
            if (p[0] == 0)
                p[0] = ++MAXID;
            p[1] = 1;
            node = p[0];
        }        
    }
    int m; cin >> m;
    while(m--)
    {
        cin >> s;
        int node = 0;
        for (char c : s)
        {
            array<int,3>& p = nxt[node][c-'a'];
            if (p[0] == 0)
                p[0] = ++MAXID;
            p[2] = 1;
            node = p[0];
        }        
    }
    cout << (dfs(0, 1) ? "Nina" : "Emilija") << "\n";
}
Compilation message (stderr)
Main.cpp: In function 'bool dfs(int, int)':
Main.cpp:19:18: warning: suggest parentheses around comparison in operand of '&' [-Wparentheses]
   19 |         if (p[0] != 0 & p[2-par])
| # | 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... |