第 313 场周赛
Date: 2022-10-02
A 公因子的数目
暴力判断即可,复杂度 \(O(min(a, b))\)。
如果 \(a, b\) 范围很大,可以先分解质因数,复杂度 \(O(\sqrt {a} + \sqrt {b})\)
B 沙漏的最大总和
暴力遍历即可,这种题用 Python 更好写。
C 最小 XOR
记 \(x\) 为 num2 中 1 的个数,我们会把这些 1 优先放到 num1 中的高位 1 上去。
这样做的目的,是尽可能地让异或结果接近 0 。
如果放完了还有剩余,则从低位开始放多余的 1,这些 1 异或后仍会是 1,所以要从低位开始放。
D 对字母串可执行的最大删除数
设 \(d[i]\) 为把 \(s[i:n]\) 的内容都删除掉的最大操作次数。那么在求解 \(d[i]\) 时,遍历每个 \(j\),从 \(i + 1\) 开始,直到 \(n - j > j - i\) 结束。
转移时,如果有 \(s[i:j] == s[j:j+j-i]\) 则考虑 \(d[i] = max(d[i], d[j] + 1)\)。
初始化时,所有 \(d[i] = 1\)。
时间复杂度:\(O(n^3)\),字符串判断是否相同可以使用字符串hash来加快。但对于 Python 来说直接对比字符串切片也可以通过本题,在 C++ 中可以使用 string_view。
class Solution {
public:
int deleteString(string s) {
int n = s.size();
vector<int> d(n, 1);
string_view ss = s;
for (int i = n - 2; i >= 0; i--) {
for (int j = i + 1; (j - i) <= (n - j); j++) {
int len = j - i;
if (ss.substr(i, len) == ss.substr(j, len)) {
d[i] = max(d[i], d[j] + 1);
}
}
}
return d[0];
}
};
本文访问 次