蒜頭君作爲蒜廠的工程師,在開發網站時不小心寫出了一個 Bug:當用戶輸入密碼時,如果既和自己的密碼一致,也同時是另一個用戶密碼的 前綴 時,用戶會跳轉到 404 頁。
然而蒜頭君堅稱:我們的用戶那麼少,怎麼可能觸發這個 Bug……
機智的你,能不能幫蒜頭君確認一下這個 Bug 到底會不會觸發呢?
輸入格式
第一行輸入一個整數 ,表示蒜廠網站的用戶數。接下來一共 行,每行一個由小寫字母 a-z
組成的字符串,長度不超過 ,表示每個用戶的密碼。蒜廠的數據庫容量太小,所有密碼長度加起來小於 。
輸出格式
如果觸發了 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 )、微信公衆號( 凝神長老和他的朋友們 )