小红书4.23笔试 3/3 口胡题解

没保存代码,口胡一下 #小红书# #笔试#

第一题是A_n = 1 + (n + 1) * A_{n - 1},递推即可。
复杂度O(n)

第二题是dfs找连通块,遍历到的红色点全部涂回白色,每一次找红色的点进行dfs,并统计一下连通块中点的数量,然后排序输出第k大即可。
复杂度O(n)  (如果排序的话要加 m logm(m为连通块数),不过本来求第k大也有O(m)的解法,就是这里没必要用)

第三题首先找长度为n的所有字串的美丽度之和。
使用r[n], re[n], red[n]代表长度为n的所有子串出现'r', 're', 'red'的次数。
分成前n-1位和最后一位去看。
r的话,最后一位有三种选择,所以前n-1位r的总数量要乘3,然后再加上最后一位是r,前n-1位有3^(n-1)种选择。
re的话,最后一位有三种选择,所以前n-1位re的总数量要乘3,然后再加上最后一位是e时,前n-1位中r的数量。
red的话,最后一位有三种选择,所以前n-1位red的总数量要乘3,然后再加上最后一位是d时,前n-1位中re的数量。   
r[n] = r[n - 1] * 3 + 3^(n - 1)
re[n] = re[n - 1] * 3 + r[n - 1]
red[n] = red[n - 1] * 3 + re[n - 1]
r[0] = re[0] = red[0] = 0
从1开始递推。
red[n]即长度为n所有字串的美丽度之和。
然后开始找长度为n所有字串的权值之和。
一共有3^n个串,其中含有的长度为k的子串有(n - k + 1)个,因此长度为n的字符串中,含有的长度为k的子串的个数一共是3^n * (n - k + 1)。
又因为所有长度为k的子串出现的次数相等,因此每个长度为k的子串出现了3^(n - k) * (n - k + 1)次。
所以直接计算sum{ red[k] * 3^(n - k) * (n - k + 1) }(3 <= k <= n)即可。
注意一下取模时机,三个数相乘容易爆long long,每两个数相乘就取一下模。
复杂度O(n)
全部评论
第三题写的好!(我感觉这应该已经是这种子序列问题的极限难度了)
1 回复 分享
发布于 2023-04-24 16:37 江苏
第三题题解写的太好了
点赞 回复 分享
发布于 2023-04-24 21:57 陕西
大佬 第三题写的好呀
点赞 回复 分享
发布于 2023-04-23 22:21 湖北
第二题一直卡27%不知道为啥
点赞 回复 分享
发布于 2023-04-23 19:11 北京
第二题总是36% 很奇怪 明明很简单的dfs染色问题
点赞 回复 分享
发布于 2023-04-23 19:00 江苏
我没有明白第二题那个u v的意思,我想问问大佬,u的值能重复吗,也就是说每个节点能出度为2吗?
点赞 回复 分享
发布于 2023-04-23 18:54 北京
想问问第三题三个数组的递推式是怎么出来的呢
点赞 回复 分享
发布于 2023-04-23 18:42 广东

相关推荐

用微笑面对困难:只要你保证项目和获奖都是真的就行尤其是“对战,总负责人”啊这些套职,基本上队员,打杂的都这么写
点赞 评论 收藏
分享
头像
09-01 09:00
已编辑
四川旅游学院 运营
牛客55195891...:主要是专业不好,别的没毛病
牛客解忧铺
点赞 评论 收藏
分享
评论
7
15
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务