Submission #1213013

#TimeUsernameProblemLanguageResultExecution timeMemory
1213013ay136416Vlak (COCI20_vlak)Java
70 / 70
169 ms33224 KiB
/// read all the words into a trie, marking who has what word
// minimax like strategy
// generate test case!!!!
import java.util.Scanner;
import java.util.StringJoiner;

class Main {
    static class Trie {
        TrieNode head; // does it belong to nina, but we don't say she has moves if it's a leaf node 
        /*public void add(char[] s, boolean belongsToNina) {
            TrieNode cur = head;
            int i = 0;
            
            while (i < s.length) {
                //System.out.println((int) s[i]);
                if (belongsToNina) {
                    cur.num_ninaswords_on_or_below++;
                } else {
                    cur.num_emiljaswords_on_or_below++;
                }
                if (cur.leaves[s[i]-'a'] == null) {
                    cur.leaves[s[i]-'a'] = new TrieNode();
                }
                cur = cur.leaves[s[i]-'a'];
                
                
                i++;
            }
            /*if (belongsToNina) {
                cur.num_ninaswords_on_or_below++;
            } else {
                cur.num_emiljaswords_on_or_below++;
            }
            cur.isTerminal=true;
            /*if (belongsToNina) {
                cur.num_ninaswords_on_or_below++;
            } else {
                cur.num_emiljaswords_on_or_below++;
            }
        }*/
        public Trie() {
            head = new TrieNode();
        }
        public String toString() {
            return this.head.toString();
        }
    }
    static class TrieNode {
        long num_ninaswords_on_or_below;
        long num_emiljaswords_on_or_below;
        boolean isTerminal;
        TrieNode[] leaves;
        public TrieNode() {
            num_emiljaswords_on_or_below=0;
            num_ninaswords_on_or_below=0;
            isTerminal=false;
            //this.belongsToNina = belongsToNina;
            leaves = new TrieNode[28];
        }
        public void add(char[] s, int pos, boolean belongsToNina) {
            if (pos==s.length) return;
            if (belongsToNina) {
                this.num_ninaswords_on_or_below++;
            } else {
                this.num_emiljaswords_on_or_below++;
            }
            if (this.leaves[s[pos]-'a'] == null) {
                this.leaves[s[pos]-'a'] = new TrieNode();
            }
            this.leaves[s[pos]-'a'].add(s, pos+1, belongsToNina);
        }
        public String toString() {
            StringBuilder sb = new StringBuilder();
            sb.append("<TrieNode nina="+num_ninaswords_on_or_below+" emilja="+num_emiljaswords_on_or_below+" leaves=[");
            StringJoiner sj = new StringJoiner(", ");
            for (int i = 0; i<26; i++) {
                if (leaves[i]!=null) {
                    sj.add((char) (i+'a') + ": " + leaves[i].toString());
                }
            }
            sb.append(sj.toString());
            sb.append("]>");
            return new String(sb);
        }
        public boolean hasNoChildren() {
            for (int i = 0; i<leaves.length; i++) {
                if (leaves[i] != null) return false;
            }
            return true;
        }
    }
    public static void main(String[] args) {
        //System.err.println("I am ready");
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Trie trie = new Trie();
        for (int i = 0; i<n; i++) {
            trie.head.add(sc.next().toCharArray(),0, true);
        }
        int m = sc.nextInt();
        for (int i = 0; i<m; i++) {
            trie.head.add(sc.next().toCharArray(),0, false);
        }
        sc.close();
       // System.out.println("THIS IS MY TRIE: " + trie + "\n\n\n");
        /*for (int i = 0; i<trie.head.leaves.length; i++) {
            if (trie.head.leaves[i] != null) {
                if (!minimax(trie.head.leaves[i], false)) ans=true;
            }
        }*/
        boolean ans = minimax(trie.head, true);
        System.out.println(ans ? "Nina" : "Emilija");
    }

    public static boolean minimax(TrieNode node, boolean maximizingPlayer) { // returns whether i win
        //if (node==null) return false;
        if (maximizingPlayer && node.num_ninaswords_on_or_below == 0) return false;
        if (!maximizingPlayer && node.num_emiljaswords_on_or_below == 0) return false;
        /*if (maximizingPlayer) {
            boolean can=false;
            for (int i = 0; i<node.leaves.length; i++) {
                if (node.leaves[i] != null && node.leaves[i].num_ninaswords_on_or_below > 0) can=true;
            }
            //if (!can) return false;
        } else {
            boolean can=false;
            for (int i = 0; i<node.leaves.length; i++) {
                if (node.leaves[i] != null && node.leaves[i].num_emiljaswords_on_or_below > 0) can=true;
            }
            //if (!can) return false;
        }*/
        

        for (int i = 0; i<node.leaves.length; i++) {
            if (node.leaves[i] != null) {
                if (!minimax(node.leaves[i], !maximizingPlayer)) return true;
            }
        }
        return false;
        //}
        //if (!maximizingPlayer && node.num_emiljaswords_on_or_below == 0) return false;
        /*boolean canMakeMove = false;
        for (int i = 0; i<node.leaves.length; i++) {
            if (node.leaves[i] != null) {
                if (
                    (maximizingPlayer && node.leaves[i].num_ninaswords_below>0)
                    ||(!maximizingPlayer && node.leaves[i].num_emiljaswords_below>0)) 
                    canMakeMove=true;
            }
        }
        if (!canMakeMove) return false;*/
    }

}
#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...