第 380 场周赛 解题报告 | 珂学家 | 数位DP 二分 + 字符串Hash


前言

image.png


整体评价

感觉T3更难些,T4太直接了,一般的KMP/StringHash基本就够用了。

上周T4出数位DP,估计是为T3打了一个铺垫。


A. 最大频率元素计数

思路: 模拟即可

class Solution {public int maxFrequencyElements(int[] nums) {Map<Integer, Integer> hash = new HashMap<>();for (int v: nums) {hash.merge(v, 1, Integer::sum);}int fre = hash.values().stream().mapToInt(Integer::valueOf).max().getAsInt();return (int)hash.values().stream().filter(x -> x == fre).count() * fre;}
}

B. 找出数组中的美丽下标 I

和T4一起讲


C. 价值和小于等于 K 的最大数字

思路: 数位DP+二分

这题题目真的绕,有点头痛

其二分阶段性还是非常的明显的,就是如何写check的问题。

数位DP,可以递推着写,就是沿着边界计算,因为这是二进制,反而比 传统的数位DP(记忆化搜索)更简洁。

其核心为

定义左侧 1 的有效位数 a c c 1 ,右侧的长度 l e f t 定义左侧1的有效位数acc1,右侧的长度left 定义左侧1的有效位数acc1,右侧的长度left

s 1 = 前置 1 的个数 ∗ 右侧可构造的个数 = a c c 1 ∗ 2 l e f t s1 = 前置1的个数 * 右侧可构造的个数 = acc1 * 2 ^ {left} s1=前置1的个数右侧可构造的个数=acc12left

s 2 = 右侧可构造的个数中包含 1 的总个数 = 2 l e f t ∗ ( l e f t / x ) / 2 s2 = 右侧可构造的个数中包含1的总个数 = 2 ^ {left} * (left/x) / 2 s2=右侧可构造的个数中包含1的总个数=2left(left/x)/2

class Solution {boolean check(long m, long k, int x) {String s = new StringBuilder(Long.toString(m, 2)).reverse().toString();char[] str = s.toCharArray();long res = 0;int acc = 0;for (int i = str.length - 1; i >= 0; i--) {int p = str[i] - '0';if (p == 1) {int left = i;res += (1l << left) * acc;res += (1l << left) * (left / x) / 2;}if ((i + 1) % x == 0 && p == 1) acc++;}res += acc;return res <= k;}// 二分+数位DPpublic long findMaximumNumber(long k, int x) {long l = 0, r = 1l << 50;while (l <= r) {long m = l + (r - l) / 2;if (check(m, k, x)) {l = m + 1;} else {r = m - 1;}}return r;}}

如果非要用记忆化的方式,感觉状态应该是

( 第 i 位,前缀 1 的有效个数 ) (第i位,前缀1的有效个数) (i位,前缀1的有效个数)


D. 找出数组中的美丽下标 II

思路: KMP/StringHash

因为手头有StringHash板子,所以用了StringHash求解

当然用了双Hash, 避免被Hack.

class Solution {public List<Integer> beautifulIndices(String s, String a, String b, int k) {long mod = (long)1e9 + 7;int p1 = 13, p2 = 17;StringHash h1 = new StringHash(s, p1, mod);StringHash h2 = new StringHash(s, p2, mod);List<Integer> lists = new ArrayList<>();long t1 = StringHash.evaluate(a, p1, mod);long t2 = StringHash.evaluate(a, p2, mod);for (int i = 0; i <= s.length() - a.length(); i++) {if (h1.query(i, i + a.length() - 1) == t1 && h2.query(i, i + a.length() - 1) == t2) {lists.add(i);}}TreeSet<Integer> ts = new TreeSet<>();long t3 = StringHash.evaluate(b, p1, mod);long t4 = StringHash.evaluate(b, p2, mod);for (int i = 0; i <= s.length() - b.length(); i++) {if (h1.query(i, i + b.length() - 1) == t3&& h2.query(i, i + b.length() - 1) == t4) {ts.add(i);}}List<Integer> res = new ArrayList<>();for (int i: lists) {if (ts.contains(i)) {res.add(i);} else {Integer k1 = ts.floor(i);Integer k2 = ts.ceiling(i);if (k1 != null && Math.abs(k1 - i) <= k) res.add(i);else if (k2 != null && Math.abs(k2 - i) <= k) res.add(i);}}return res;}staticclass StringHash {char[] str;long p, mod;int n;long[] pre; // hash前缀和long[] pow; // p的幂次public StringHash(String s, int p, long mod) {this.str = s.toCharArray();this.p = p;this.mod = mod;this.n = str.length;pre = new long[n + 1];pow = new long[n + 1];pow[0] = 1;for (int i = 1; i <= n; i++) {pow[i] = pow[i - 1] * p % mod;}for (int i = 0; i < str.length; i++) {pre[i + 1] = (pre[i] * p % mod + str[i]) % mod;}}long query(int l, int r) {long res = pre[r + 1] - pre[l] * pow[r - l + 1] % mod;return (res % mod + mod) % mod;}long rotate(int l) {if (l < 0 || l >= str.length - 1) {return query(0, str.length - 1);} else {long h1 = query(0, l);long h2 = query(l + 1, str.length - 1);return (h2 * pow[l + 1] % mod + h1) % mod;}}static long evaluate(String s, int p, long mod) {long h = 0;for (char c: s.toCharArray()) {h = (h * p % mod + c) % mod;}return h;}}
}

写在最后

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/621339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt5.14.2配置opencv4.5.5

使用环境&#xff1a;windows&#xff0c;opencv4.5.5&#xff0c;qt5.14.2&#xff0c;msvc编译器 这里的opencv文件是已经编译好了&#xff0c;在qt工程中配置就可使用&#xff0c;编译器得是msvc才行&#xff0c;MinGW不管用。 资源地址&#xff1a;https://download.csdn.…

【深度学习每日小知识】Computer Vision 计算机视觉

计算机视觉是人工智能的一个领域&#xff0c;涉及算法和系统的开发&#xff0c;使计算机能够解释、理解和分析来自周围世界的视觉数据。这包括从静态图像到视频流甚至 3D 环境的一切。 使用对象检测和特征提取等方法&#xff0c;计算机视觉本质上需要从视觉输入中提取有用信息…

2023 IoTDB Summit:天谋科技高级开发工程师苏宇荣《汇其流:如何用 IoTDB 流处理框架玩转端边云融合》...

12 月 3 日&#xff0c;2023 IoTDB 用户大会在北京成功举行&#xff0c;收获强烈反响。本次峰会汇集了超 20 位大咖嘉宾带来工业互联网行业、技术、应用方向的精彩议题&#xff0c;多位学术泰斗、企业代表、开发者&#xff0c;深度分享了工业物联网时序数据库 IoTDB 的技术创新…

华为手机备份全过程(保姆级问题解决方案)

手机备份 前言主体信息备份一、关闭windows安全中心的内存完整性二、开启 USB 调试&#xff0c;尝试使用 ADB 连接三、开始备份 微信备份QQ备份写在最后遗留问题 前言 我的手机是荣耀 20&#xff0c;虽然不是华为&#xff0c;但系统还是鸿蒙的系统&#xff08;毕竟那阵荣耀还是…

reactNative0.71版本的使用

开发环境配置 参考reactNative 官网 版本选中0.71 打包配置 1. IOS 打开项目 -> 进入ios目录->执行命令 pod install ->项目名称.xcworkspace -> 使用xcode打开->配置证书 证书配置截图如下 &#x1f4a1;tips&#xff1a;TARGETS目录下会有多个文件&#x…

【ArcGIS Pro微课1000例】0057:未安装所需的Microsoft驱动程序

文章目录 一、错误提示二、解决办法1. Excel转表2. Excel转csv一、错误提示 ArcGIS Pro添加Excel数据时,提示未安装所需的Microsoft驱动程序,如下图所示: 二、解决办法 1. Excel转表 在选择输入表时,可能会提示未安装所需的 Microsoft 驱动程序。 这是因为要在 ArcGIS P…

为什么光刻要用黄光

光刻是集成电路&#xff08;IC或芯片&#xff09;制造中的重要工艺之一。简单来说&#xff0c;它是通过使用光掩膜和光刻胶在基板上复制电路图案的过程。 基板将涂覆硅二氧化层绝缘层和光刻胶。光刻胶在被紫外光照射后可以容易地用显影剂溶解&#xff0c;然后在腐蚀后&#xf…

控制网页的灰度显示

1.代码&#xff1a; 普通网页 <style>html {filter: grayscale(100%);}</style> 或是:webkit内核浏览器写法 <style>html {-webkit-filter: grayscale(100%)}</style> 2.说明&#xff1a; grayscale(amount) :进行灰度转换。 amount转换值的大小&…

Embeddings: What they are and why they matter

embeddings 是什么意思https://simonwillison.net/2023/Oct/23/embeddings/推荐原因&#xff1a;GPT 模型的基础是一种叫做 embeddings 的技术&#xff0c;用来将文本转换成向量&#xff0c;从而可以计算出文本之间的相似度。这篇文章详细地介绍了embeddings及应用 Embeddings…

Java多线程并发篇----第十三篇

系列文章目录 文章目录 系列文章目录前言一、Semaphore 信号量二、Semaphore 与 ReentrantLock 区别三、可重入锁(递归锁)四、公平锁与非公平锁前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,…

数据库与SQL

数据库与SQL 学习链接数据库关系型数据库管理系统&#xff08;RDBMS&#xff09; SQLSQL介绍SQL类型SQL 基础语言学习创建表&#xff08;create table&#xff09;语法 数据类型SQL最常用的数据类型 学习链接 基础篇&#xff1a;数据库 SQL 入门教程 数据库 用于存储数据 存放…

对接苹果CMS芒果影视APPV1.0(附安装教程+源码支持多端)内置采集脚本

目录 概述1. 演示效果1.1 视频演示1.2 图文演示1.2.1 首页1.2.2 专题页1.2.3 搜索1.2.4 观影 2. 支持功能3. 插件和框架4. 部署方法4.1 后端4.1.1 准备工具4.1.2创建站点4.1.3 上传后端代码到服务器4.1.4 导入数据库4.1.5 配置数据库信息4.1.6访问后台管理系统 4.2 前端4.2.1 准…

【开发日记】IDEA“找不到或无法加载主类”问题

记录一个研究了两个小时的“玄学”问题找不到或无法加载主类。 ​1、问题 使用IDEA启动SpringBoot项目显示找不到或无法加载主类。 2、解决经历 尝试了很多种解决方法都没有解决&#xff0c;下面是我网上查询后尝试的一些方法。这些方法我都没有解决问题&#xff0c;是因为…

css3背景与渐变

css3背景与渐变 前言背景颜色background-color基础知识背景图片background-image基础知识背景图片的重复模式 背景尺寸background-sizecontain和cover是两个特殊的background-size的值 背景裁切 background-clip背景固定 background-attachment背景图片位置 background-positio…

Redis数据结构学习笔记

图文主要参考小林Coding的图解redis数据结构 redis为什么快 除了它是内存数据库&#xff0c;使得所有的操作都在内存上进⾏之外&#xff0c;还有⼀个重要因素&#xff0c;它实现的数据结构&#xff0c;使 得我们对数据进⾏增删查改操作时&#xff0c;Redis 能⾼效的处理。 数…

【学术精选】NLP可投的顶会信息(近期截稿)

顶级会议推荐 引言 国际学术会议是一种学术影响度较高的会议&#xff0c;它具有国际性、权威性、高知识性、高互动性等特点&#xff0c;其参会者一般为科学家、学者、教师等。具有高学历的研究人员把它作为一种科研学术的交流方式&#xff0c;能够为科研成果的发表和对科研学术…

文心一言 VS 讯飞星火 VS chatgpt (178)-- 算法导论13.4 1题

一、用go语言&#xff0c;在执行 RB-DELETE-FIXUP 之后&#xff0c;证明&#xff1a;树根一定是黑色的。 文心一言&#xff1a; 在证明 RB-DELETE-FIXUP 之后&#xff0c;树根一定是黑色的的过程中&#xff0c;我们首先需要理解红黑树的性质。红黑树是一种自平衡二叉搜索树&a…

简单的天天酷跑小游戏实现

初级函数实现人物,背景,小乌龟的移动 #include <graphics.h> #include <iostream> #include <Windows.h> #include "tools.h" #include <mmsystem.h> #include <conio.h> #include <time.h>//时间头文件 #include <cstdlib&g…

2024最新最全【DDOS教学】,从零基础入门到精通,看完这一篇就够了

1、互联网安全现状 随着网络世界的高速发展&#xff0c;各行业数字化转型也在如火如荼的进行。但由于TCP/IP网络底层的安全性缺陷&#xff0c;钓鱼网站、木马程序、DDoS攻击等层出不穷的恶意攻击和高危漏洞正随时入侵企业的网络&#xff0c;如何保障网络安全成为网络建设中的刚…

【STK】手把手教你利用STK进行关联分析仿真01-STK/CAT模块介绍

关联分析工具(Conjunction Analysis Tool )主要用于分析航天发射或卫星在轨运行过程中与其他目标之间的接近情况,关联分析包括: 接近分析工具 Close Approach Tool CAT高级接近分析工具 AdvCAT激光接近分析工具 LaserCAT发射窗口分析工具 Launch Window Analysis今天主要介绍…