Submission #1195085

#TimeUsernameProblemLanguageResultExecution timeMemory
1195085KindaGoodGamesVlak (COCI20_vlak)C++20
50 / 70
21 ms12716 KiB
#include<bits/stdc++.h>

#define ll long long
#define pii pair<int,int>
#define tiii tuple<int,int,int>

using namespace std;

struct TrieNode {
    vector<int> child;
    bool marked;
    bool p1;
    bool p2;

    TrieNode() {
        child.resize(26, -1);
        marked = false;
        p1 = false;
        p2 = false;
    }
};

vector<TrieNode> trie;
vector<vector<bool>> dp(2, { false });

void insert(string& s, int i, int ind, int k) {
    if (i + 1 == s.size()) {
        trie[ind].marked = true;
        return;
    }

    if (trie[ind].child[s[i] - 'a'] == -1) {
        trie[ind].child[s[i] - 'a'] = trie.size();
        trie.push_back(TrieNode());
    }
    int c = trie[ind].child[s[i] - 'a'];

    if (k == 0) {
        trie[c].p1 = true;
    }
    else {
        trie[c].p2 = true;
    }
    insert(s, i + 1, c, k);
}

void rec(int ind, int k) {
    if (trie[ind].p1 && !trie[ind].p2) {
        dp[0][ind] = 1;
        return;
    }
    if (trie[ind].p1 == false && trie[ind].p2 == true) {
        dp[1][ind] = 1;
        return;
    }
    bool ch = false;
    for (int i = 0; i < 26; i++) {
        int c = trie[ind].child[i];
        if (c != -1) {
            ch = true;
            rec(c, 1 - k);
            if (!dp[1 - k][c]) {
                dp[k][ind] = true;
            }
            if (!dp[k][c]) {
                dp[1 - k][ind] = true;
            }
        }
    }
    if (!ch) {
        dp[k][ind] = 1;
    }
}


int main() {
    trie.push_back(TrieNode());
    int n1;
    cin >> n1;

    for (int i = 0; i < n1; i++) {
        string s;
        cin >> s;
        insert(s, 0, 0, 0);
    }

    int n2;
    cin >> n2;

    if (n1 == 0) {
        cout << "Emilija" << endl;
        return 0;
    }
    if (n2 == 0) {
        cout << "Nina" << endl;
        return 0;
    }

    for (int i = 0; i < n2; i++) {
        string s;
        cin >> s;
        insert(s, 0, 0, 1);
    }

    dp = vector<vector<bool>>(2, vector<bool>(trie.size()));
    rec(0, 0);

    if (dp[0][0]) {
        cout << "Nina" << endl;
    }
    else {
        cout << "Emilija" << endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...