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\)!