計蒜客 - 糟糕的Bug

蒜頭君作爲蒜廠的工程師,在開發網站時不小心寫出了一個 Bug:當用戶輸入密碼時,如果既和自己的密碼一致,也同時是另一個用戶密碼的 前綴 時,用戶會跳轉到 404 頁。

然而蒜頭君堅稱:我們的用戶那麼少,怎麼可能觸發這個 Bug……

機智的你,能不能幫蒜頭君確認一下這個 Bug 到底會不會觸發呢?

輸入格式

第一行輸入一個整數 n(1n233333)n(1 \leq n \leq 233333),表示蒜廠網站的用戶數。接下來一共 nn 行,每行一個由小寫字母 a-z 組成的字符串,長度不超過 1010,表示每個用戶的密碼。蒜廠的數據庫容量太小,所有密碼長度加起來小於 466666466666

輸出格式

如果觸發了 Bug 則輸出一行 Bug!,否則輸出一行 Good Luck!

樣例 1

3
abc
abcdef
cdef
Bug!

樣例2

3
abc
bcd
cde
Good Luck!

這題就是最單純的線段樹模板。

對於先輸入短的,後輸入長的,就在遇到長的密碼的每一個結點判斷是不是 isEnd(),反之,則在 setEnd() 之後檢查還有沒有後面的孩子結點。

import java.util.HashMap;
import java.util.Scanner;

public class Main {

    static Scanner in = new Scanner(System.in);

    public static void main(String[] args) {
        Trie tree = new Trie();
        int n = in.nextInt();
        for (int i = 0; i < n; i++) {
            String s = in.next();
            try {
                tree.insert(s);
            } catch (Exception e) {
                System.out.println("Bug!");
                System.exit(0);
            }
        }
        System.out.println("Good Luck!");
    }

}

class Trie {

    private TrieNode root;

    /**
     * Initialize your data structure here.
     */
    public Trie() {
        root = new TrieNode();
    }

    /**
     * Inserts a word into the trie.
     */
    public void insert(String word) throws Exception {
        TrieNode node = root;
        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);
            if (!node.contains(c)) {
                node.put(c);
            }
            node = node.get(c);
            if (node.isEnd()) {
                throw new Exception("BUG");
            }
        }
        node.setEnd();
        if (node.hasChild()) {
            throw new Exception("BUG");
        }
    }
}

class TrieNode {
    private HashMap<Character, TrieNode> links;
    private boolean end;

    public TrieNode() {
        links = new HashMap<>();
        end = false;
    }

    public boolean isEnd() {
        return end;
    }

    public void setEnd() {
        end = true;
    }

    public TrieNode get(char c) {
        return links.get(c);
    }

    public void put(char c) {
        links.put(c, new TrieNode());
    }

    public boolean contains(char c) {
        return links.containsKey(c);
    }

    public boolean hasChild() {
        return !links.keySet().isEmpty();
    }

}

歡迎關注我的個人博客以閱讀更多優秀文章:凝神長老和他的朋友們(https://www.jxtxzzw.com)

也歡迎關注我的其他平臺:知乎( https://s.zzw.ink/zhihu )、知乎專欄( https://s.zzw.ink/zhuanlan )、嗶哩嗶哩( https://s.zzw.ink/blbl )、微信公衆號( 凝神長老和他的朋友們 )
凝神長老的二維碼們

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章