D1T1 加法方程
因為字母和數字是一一對應的,所以只要不同字母數多於 \(10\),方程一定無解,則一遍暴力地枚舉答案的花銷是 \(O(10!)\)。
我們發現,對於不同的答案串,它們的本質可能是相同的。
我們對相加的兩個串枚舉,得到的本質不同的串最多只有 \(10!\) 個,這很少。
那我們只要預處理出所有本質不同的答案串,再到哈希表內查詢即可。
D1T2 女生散步
簡單題,容易發現並證明答案就是最大的 \(x\) 滿足:\(\displaystyle\left\lfloor \frac{x+1}{2} \right\rfloor\left\lfloor \frac{x+4}{2} \right\rfloor<n\)。
只要二分就可以輕松計算。
D1T3 最佳收益
這題有一個重要性質:\(a,b\) 中選擇的連續段至少其中一個連續段 \(≥\) 其所在序列權值之和的一半。
因為如果不這樣的話,直接全選某一個序列肯定更優。
假設我們欽定 \(a\) 選定的權值和超過一半,那第一個滿足前綴 \(>\) 權值之和一半的位置 \(pos\) 是必定要選的。
假設我們知道 \(b\) 選了什么,貪心地想:從 \(pos\) 往兩邊盡量延伸一定是最優解。
記 \(f(l,r)\) 為 \(b\) 序列選 \([l,r]\) 時的值,則有 \(f(l,r)=sumb[r]-sumb[l-1]+a\) 序列選取位置的權值和。(其中 \(sumb\) 表示 \(b\) 序列前綴和)
考慮枚舉右端點,固定下 \(sumb[r]\),看看它會對那些左端點的權值產生影響,這實際上就是一個單調棧的過程,線段樹維護即可。
復雜度 \(O(nlogn)\),常數較大,卡時才能過。
D2T1 遺傳密碼
一個很顯然的暴力是把所有模式串正着插進一棵 \(Trie\),反着插進另一棵,每次轉移先被動轉移在主動轉移。
如果串長比較大,直接在 \(Trie\) 樹上暴力跳復雜度肯定爆炸,如果我們知道它可以(被)轉移到的位置就可以用線段樹優化。
這實際上就是一個求模式串與自己前綴的最長公共后綴、與自己后綴的最長公共前綴。
我們可以用 \(exkmp\) 求出。
那就很好做了,考慮根號分治,串長較小的用第一種做法,較大的用第二種做法。
時間復雜度 \(O(n\sqrt{nlogn})\)。
D2T2 天文奇觀
不會,咕了。
D2T3 外星飛碟
看到題乍一看不會做(實際也不會做
考慮打個表找個規律,發現答案就是 \(n!-2n-1\)。
但 \(n\leq 10^{10}\) 直接暴力求似乎不好做,模數不固定,而且不是素數,沒有太好的辦法,怎么辦呢…………
那就直接寫 \(O(n)\) 的暴力,然后你就過了,這就是 \(FJOI\)!