Submission #1137014

#TimeUsernameProblemLanguageResultExecution timeMemory
1137014toast12Vlak (COCI20_vlak)C++20
20 / 70
25 ms23188 KiB
#include <bits/stdc++.h>
using namespace std;

const int K = 26;

struct vertex {
    int next[K];
    int end = 0;
    bool winnable_n = false, winnable_e = false; // who can win if they land on this node?
    bool n = false, e = false;
    vertex() {
        fill(next, next+K, -1);
    };
};

vector<vertex> trie(1);

void add_string(string s, bool e) {
    int v = 0;
    for (int i = 0; i < s.length(); i++) {
        int c = s[i]-'a';
        if (trie[v].next[c] == -1) {
            trie[v].next[c] = trie.size();
            trie.emplace_back();
        }
        if (e) trie[v].e = true;
        else trie[v].n = true;
        v = trie[v].next[c];
    }
    trie[v].end++;
}

vector<vector<bool>> dp, ready;

bool solve(int v, int turn) {
    // turn = 0 --> nina
    // turn = 1 --> emilija
    if (ready[v][turn]) return dp[v][turn];
    if (turn == 1 && !trie[v].e) return false;
    if (turn == 0 && !trie[v].n) return false;
    if (trie[v].end) {
        if (turn == 1) {
            trie[v].winnable_e = true;
            return true;
        }
        else {
            trie[v].winnable_n = true;
            return true;
        }
    }
    bool ans = false;
    for (int i = 0; i < K; i++) {
        if (trie[v].next[i] != -1) ans |= !solve(trie[v].next[i], 1-turn);
    }
    ready[v][turn] = true;
    return dp[v][turn] = ans;
}

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        string s;
        cin >> s;
        add_string(s, true);
    }
    int m;
    cin >> m;
    for (int i = 0; i < m; i++) {
        string s;
        cin >> s;
        add_string(s, false);
    }
    ready.resize(trie.size()+1, vector<bool>(2));
    dp.resize(trie.size()+1, vector<bool>(2));
    if (solve(0, 0)) cout << "Nina\n";
    else cout << "Emilija\n";
    return 0;
}
#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...