百度笔试 2023.03.28
A. 字符串重组
给定一个字符串,判断能不能经过重排序编程 "Baidu".
思路:把输入的字符串和 "Baidu" 都排序一下再比较,相等就可以,不相等就不行。
B. 构造字符串
给定一个数 x,要用 r,e,d三种字符构造一个字符串,它的回文子串的数量恰好为 x, 要求字符串的长度小于 .而 x 的范围是
思路:不难发现,如果用 red 为循环节,构造出来的字符串中,即形如 redredred....,任意长度大于等于 2 的子串都不是回文字符串,因此,回文字符串只有单个字符组成的子串,此时字符串的长度就是回文子串的数量。因此,对于 x 小于 的输入是非常简单的,只需要用 red 循环拼出一个长度为 x 的字符串即可。
对于 x 更大的情况,简单考虑,多个重复字符组成的字符串的回文子串数量比较好算,而且数量增加也比较快,因此考虑优先使用相同字符。设 为长度为 n 的全为 d 字符组成的字符串的回文子串数量,
,
. 由于输入最大是
, 大概 n 为
以下
就能覆盖输入的范围。因此先预处理出
, 然后二分找出比 x 小的最大的
, 答案的前半部分就是
个 d, 而后半部分就比较小了,交给 x 小于
的情况来解决。
C. 树上同色连通块
现在有一颗树,n 个节点,树上的节点染成红色或者蓝色,定义边的权值为,删除该边后两个子树中同色连通块的大小之差的绝对值,要求所有边的权重之和。
思路:
用 表示以 i 节点为根的子树中的同色连通块数量,则:
, 其中 j 是 i 的子节点。
可以自底向上地求出。
求完 之后自顶向下地求出答案 ans, 从根节点开始,每次向下递归的时候计算对应的边的贡献:
.