雙倒一啦!
感覺這次最大的錯誤就是沒看 T2。(本質原因還是時間浪費的太多了)
賽時記錄在閒話啦
accoder 多校比賽連結
02 表示法
唐詩題!考高精的人都\(**\),輸出深度優先搜尋解決。高精乘 2、高精減。
子串的子串
官方題解寫的不好,放一下 Ratio 的好吃題解:
意思就是:\(ans_{l,r-1}\) 和 \(ans_{l+1,r}\) 中 包含重複的部分 \(ans_{l+1,r-1}\),於是我們用 \(ans_{l,r-1} + ans_{l+1,r}-ans_{l+1,r-1}\) 來轉移得到 \(ans_{l,r}\) 以避免重複,最後別忘了再加上字串 \(s[l,r]\) 自己。
魔法咒語
trie 樹
非官方題解思路:(CTH 巨佬的賽時思路,更好理解)
正序、倒序各建一顆 trie 樹分別記為 \(tr1,tr2\),那麼所有字首的個數就是 \(tr1\) 的節點數,字尾的個數就是 \(tr2\) 的節點數。
但直接相乘顯然會有重複部分,比如兩個字串:abc 和 cd,字首 abc 和 字尾 d 可以拼成一個字串 abcd,同樣字首 ab 和 字尾 cd 也可以拼成abcd,有重複,考慮怎麼減去這部分重複。
什麼時候會有這樣的重複呢?發現如果我們存在一個字首的最後一個字元和一個字尾的第一個字元相同時,就會造成 1 個重複,因為 (該字首刪去最後一個字元加上該字尾) 與 (該字首加上該字尾刪去第一個字元)可以拼成相同的字串。
但注意,我們所找的會造成重複的字首和字尾不能只有一個字元(這樣刪去一個字元後就成空串了,但題目要求不為空)。
所以我們對於 26 個英文字母分別記它們作為字首最後一個字元的個數 \(cntQ_{字母}\) 和 作為字尾第一個字元的個數 \(cntH_{字母}\),保證這些字首、字尾都是兩個及以上的字元。
那麼答案就是兩棵樹的節點數相乘減去 \(\sum _{i=26 個英文字母} cntQ_i\times cntH_i\)。
表示式
賽時最後五十分鐘打了 45 部分分(不會 CRT),以為會很極限了,結果讀入出鍋保齡 RE 了。
部分分:
-
\(15pts\):暴力,每次詢問從 \(1~n\) 算一遍就好了;
-
\(5pts\):每次詢問時所有符號相同的情況,記一下所有數的加和 \(s\) 以及乘積 \(f\),詢問 \(x\) 時符號是 + 答案就是 \(x+s\),是 * 答案就是 \(x\times f\),是 ^ 答案就是 \(x^f\);
-
\(15 pts\)(但實際有 \(25pts\)):對於沒有 ^ 的樣例,可以分塊或者線段樹簡單維護就好,如果詢問 \(x\) 時,序列可以轉化為:\((k_1x+b_1)\times k_2+b_2=k_1k_2x+k_2b_1+b_2\),那麼 \(k_{new}=k_1k_2,b_{new}=k_2b_1+b_2\),分塊預處理出每個塊的總 \(K\) 和 總 \(B\) 就好了,更新時把整個塊重新遍歷一遍,更新 \(K,B\) ,查詢計算一遍所有塊得到總的 \(k_總\) 和 \(b_總\),代入 \(x\) 計算。
正解:
資料點分治
前三個點模數過大但資料範圍小直接暴力。
其他的點對於模數特別小的,直接維護線段樹上的點所有 \(x=[0,mod-1]\) 進入該點時得到的答案,時間複雜度大概是 \(O(qn\log n mod)\)。
而模數較大但是是合數的,把模數拆分成多個小一點的互質的數作為模數,對於每個模數分別像以上方式一樣維護,最後 CRT 合併即可。
End
哦對,CTH 大佬無論講題還是調題都巨棒呢,人也很熱心,什麼巨型資料結構啊,5k 以上程式碼啊,都歡迎來找 CTH 調捏