Submission #1227802

#TimeUsernameProblemLanguageResultExecution timeMemory
1227802opop1omarVlak (COCI20_vlak)C++17
0 / 70
347 ms589824 KiB
#include <bits/stdc++.h> using namespace std; #define Ah_Ya_Alisson_Ah ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define int long long struct Trie { struct Node { Node* child[26]; int IsEnd, Prefix; Node() { memset(child, 0, sizeof child); IsEnd = Prefix = 0; } }; Node* root = new Node(); void insert(string &s) { Node* cur = root; for (auto it : s) { int idx = it - 'a'; if (cur->child[idx] == 0) { cur->child[idx] = new Node(); } cur = cur->child[idx]; cur->Prefix++; } cur->IsEnd++; } }; Trie a, b; // dp[curA][curB][turn] = true if current player can force a win map<pair<Trie::Node*, int>, bool> memo[2]; bool dp(Trie::Node* cur, int c) { if (memo[c].count({cur, c})) return memo[c][{cur, c}]; bool canWin = false; for (int i = 0; i < 26; i++) { if (c == 0) { // Player A if (cur->child[i]) { if (!dp(b.root, 1)) { // If opponent loses after this move, we can force a win canWin = true; break; } } } else { // Player B if (cur->child[i]) { if (!dp(a.root, 0)) { canWin = true; break; } } } } return memo[c][{cur, c}] = canWin; } void solve() { int n; cin >> n; while (n--) { string s; cin >> s; a.insert(s); } cin >> n; while (n--) { string s; cin >> s; b.insert(s); } bool result = dp(a.root, 0); cout << (result ? "Nina\n" : "Emilija\n"); } signed main() { Ah_Ya_Alisson_Ah int t = 1; // cin >> t; while (t--) solve(); }
#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...