雜湊
P2312
觀察到範圍不大,考慮列舉解。
對於一個解,比較直接的想法是代入解看是否等於 0,數太大了,所以只要把結果取模看是否為 0 即可。
模數取兩個即可。
CF985F
對於同構問題就看對應關係,即對於每個字母找到一個對應字母在另一個字串中出現的位置一樣。
那麼我們把查詢的兩個串中每個字母對應的位置處理出來,看看能不能匹配上,位置的資訊做個雜湊即可。
然後考慮匹配的話兩個排個序看看能不能配上即可。
P8819
首先考慮yes/no的條件,既然每個點出度都為 0,那麼顯然是若干個內向基環樹,顯然每個點都可以走到所在內向基環樹的環裡,所以第二個條件是不用考慮的。
接下來考慮第二個。既然每個點出度為 1,我們考慮維護每條邊的出發點,那麼出度都為 1 等價為出發點的可重集為 1 到 n。
梳理一下,現在需要維護一個可重集做到維護題目中的哪些操作。
看起來十分的不好維護,但是因為我們每次只是比較兩個集合(當前集合,目標集合1-n),所以可以考慮雜湊。
判斷兩個集合是否一樣典的不能再典了,常見的題:https://atcoder.jp/contests/abc367/tasks/abc367_f
於是我們給每個點都隨機賦權,然後判斷和是否相當即可。
字典樹
P2580
直接map即可
我們把給出的所有字串插進字典數,然後查的時候再樹上跳一跳就行了。是個板子題。
P9753
這裡我們不好快速判斷某個連續串是否滿足條件,這是個棘手的問題,如果我們不解決這個問題最快只能做到 n^2 級別,具體做法是列舉左端點然後往右掃做棧消除。
於是我們開啟了題解
結論:若對 [1,r] 進行棧消除後剩下來的數和 [1,l-1] 進行棧消除剩下來的數一樣,那麼 [l,r] 一定可以消除。
感性證明一下,假設現在已經對 [1,l-1] 進行了棧消除,結果對 [l,r] 做了以後裡面的東西沒變,那麼肯定是 [l,r] 是可以消除的自己裡面消了.
那麼我們對所有字首做一下,然後看看有多少對相同的,用 map 統計一下,就得到一個 nlogn 的解法了,運用一點手法可以透過。
我們有什麼方法可以快速統計之前某個串的出現次數呢?字典數!
因為每次我們最多在樹上移動一次,所以單次複雜度 O(1) 且節點個數最多 n 個,可以透過本題!