多校A層衝刺NOIP2024模擬賽04
T 02表示法
簽到題
記得有一道普及題是沒加高精的原吧...
將原數高精除變為二進位制,然後記搜就好了。
T 子串的子串
簽到題
注意到 \(n\) 很小支援 \(O(n^2)\) 的操作,可以直接預處理出所有 \(l,r\) 的個數,預處理方式可參考數顏色一題,對於相同的子串只記錄隨靠右的貢獻。對於判斷前驅可以 \(hash\) + \(unordered_map\) 由於串比較多,考慮聰明一點記錄前驅,可以按長度分組做,這樣每組最多有 \(O(n)\) 個子串 \(hash\) 衝突機率大大降低,常數也就變小了。
時間複雜度為 \(O(wn^2+q)\)。
T 魔法咒語
trie樹,計數題
首先用 trie 樹對所有前字尾去重,直接正反插入一遍就好了。
現在考慮怎樣拼接前字尾才能做到不重不漏,發現如果直接拼接會計重是因為一個字首的字尾與一個字尾的字首相等,導致拼接時結果相同結果的斷點有多個,考慮列舉字首,對於一個字首在其 trie 樹中所對應的結點,不將結點子樹中已有字元的貢獻加入,這樣就保證了上述情況只會計算一次,但是會有一種情況會算漏,即剛好以子樹中存在的字元為結尾,直接特判記錄單個字尾字元即可,以及特判長度為 1 的串就行了。
時間複雜度為 \(O(w\sum |s|)\),\(w\) 為字符集大小 。
T 表示式
crt,線段樹
首先看到有一些資料點的模數很小,從而產生以模數為值域,預處理出一段區間內這個值域內數從左到右依次計算這個區間最後的值,這個東西顯然是具有結合律的,可以上線段樹。
但是對於其他點來說時間複雜度直接爆炸了,每一次區間合併時間複雜度都是 \(O(P)\) 的。
注意到題目給出的模數並不是一個質數,考慮拆解模數,然後分別做上述相同的操作,最後 crt 合併就行了。前 3 個點依舊需要暴力。
時間複雜度為 \(O(Snlogn)\),\(S\) 為模數拆解後的和。