計蒜客 習題 糟糕的bug(Trie樹)

2021-08-17 19:18:24 字數 2018 閱讀 8487

蒜頭君作為蒜廠的工程師,在開發**時不小心寫出了乙個 bug:當使用者輸入密碼時,如果既和自己的密碼一致,也同時是另乙個使用者密碼的字首時,使用者會跳轉到 404 頁。

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

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

第一行輸入乙個整數n(1≤n≤233333),表示蒜廠**的使用者數。接下來一共 n 行,每行乙個由小寫字母a-z組成的字串,長度不超過 10,表示每個使用者的密碼。蒜廠的資料庫容量太小,所有密碼長度加起來小於 466666。

如果觸發了 bug 則輸出一行bug!,否則輸出一行good luck!

樣例輸入1

3

abcabcdef

cdef

樣例輸出1

bug!

樣例輸入2

3

abcbcd

cde

樣例輸出2

good luck!

題目型別就是串匹配,找字首,多串情況下,很應該想到字首樹,也稱為trie樹。

這裡首先需要把所有串都讀下來插入之後再進行匹配,因為你不能確定一定是前面的是後面的字首。

對cnt處理的時候 也不能像這個trie樹處理一樣,即:

需要注意的是,本題這裡需要找乙個串是否為另乙個串的字首,與字首樹的乙個小小區別是,字首樹會統計乙個串的每個字首出現次數,而這裡只需要統計每個串出現的次數。

那麼如何判斷乙個串是不是另乙個串的字首呢?這裡就用到反向比較的方法了。

例如:字串:abc,和字串abcd。再trie樹中,abc對應的出現次數為1,在搜尋abcd的過程中會發現abc出現過,即存在乙個題目所述的「bug!」。

另外,思考一下,為什麼不會因為找到自己而返回true,導致出現bug呢?

注意下在trie樹中儲存字串出現次數的方法,**第33行儲存乙個字串出現的次數時,是字串遍歷結束,最後乙個字母所指向的儲存位置,而在查詢過程中**第39行的那個「p」其實是字串中倒數第二個字母所指向的儲存位置,因此,是不會遍歷到自己的。

此時就引發了乙個思考,如果有兩個串是一致的,那麼該**會引發乙個什麼答案呢?

嘗試一下,就會發現,該樣例不成為為題目中所述的「bug!」,但該樣例是否應該觸發「bug!」呢?嚴格來說是應該觸發的,即自身屬於自身的乙個字首,當出現兩個人的密碼一致時,是應該觸發乙個「bug!」,但這份**依然通過了所有測試樣例,由此可見,後台應該沒有考慮這種情況。

但如果需要處理這種情況,該如何應對呢?

也很簡單,判斷某個字串是否出現過超過一次即可。

怎麼判斷呢?挨個遍歷比較?o(n^2)的複雜度。

那有什麼高效演算法呢?字首樹呀,**33行一旦該值超過1,就說明該串出現了兩次,直接返回觸發「bug!」

#include #include #include using namespace std;

#define max_n 2333430

#define max_c 26

struct trie

void insert( const char* str )

if ( ch[p][str[i]-'a'] == -1 )

p = ch[p][str[i]-'a'];

} cnt[p] ++;// 這裡記錄完整的串 而不是字首 }

bool find( const char* str )

return false;

}};char s[max_n][15];

trie trie;

int main()

for ( int i = 0 ; i < n ; ++ i )

} if ( ans ) else

return 0;

}

計蒜客習題 朋友

在社交的過程中,通過朋友,也能認識新的朋友。在某個朋友關係圖中,假定 a 和 b 是朋友,b 和 c 是朋友,那麼 a 和 c 也會成為朋友。即,我們規定朋友的朋友也是朋友。現在,已知若干對朋友關係,詢問某兩個人是不是朋友。請編寫乙個程式來解決這個問題吧。輸入格式 第一行 三個整數 n,m,p n ...

計蒜客習題 逃跑

一位博主寫了ac 但是無論是廣度bfs還是深度dfs,都會報錯,dfs是執行超時,bfs是答案錯誤。傳送門 另一位博主使用了dfs 有興趣可以看下,沒有檢驗是否正確,傳送門 根據前位博主的bfs 做了幾項修改,然後用自己的 找錯前位博主,發現找不出來,有興趣的小夥伴可以試下,找一下前位博主的錯誤。當...

計蒜客 字典樹 糟糕的bug

蒜頭君作為蒜廠的工程師,在開發 時不小心寫出了乙個 bug 當使用者輸入密碼時,如果既和自己的密碼一致,也同時是另乙個使用者密碼的 字首 時,使用者會跳轉到 404 頁。然而蒜頭君堅稱 我們的使用者那麼少,怎麼可能觸發這個 bug 機智的你,能不能幫蒜頭君確認一下這個 bug 到底會不會觸發呢?第一...