【蓝桥杯】每日练习 Day12 贡献法

前言

今天给大家带来两道贡献法的问题,先来讲一下什么是贡献法

贡献法,与其说是一种算法,不如说是一种数学方法,是一种思维方式

先来给大家举个例子,假设现在有个问题,需要你在一个只有小写字母的字符串中查找所有仅包含一个字符a子串数量

暴力的话是枚举所有子串,O(n^2)显然不符合我们的预期,那么有什么方法优化呢?

这就要用到我们今天要讲的贡献法了,这一种横看成岭侧成峰的算法,我们来观察下面的样例。

bbbbbacccc

可以发现在中间位置出现了a,我们将a的左右两侧划分出来。

bbbbb|a|cccc

问题就转化成了在a左边选一个字母,同时在a右边选一个字母的所有选法。

我们设左边的字符数量为left,右边的字符数量为right,那么根据排列组合的知识可以得到子串数量为:

(left + 1) * (right + 1)

注意这里要加一因为a也要算进去。

以上就是贡献法的大致思路,所谓横看成岭侧成峰,就是从结果出发,逆推出有效的结论

可能有的小伙伴发现了我们这个题目有一个要求,即——仅包含一个字符a

那我们就来想一下,如果没有这个条件,贡献法可不可行呢?

答案是否定的,我们来观察下面的序列

bbbbabbabbb

可以明显的发现最长的串是同时包含两个a的,而我们使用贡献法就需要分别求出包含指定a的所有子串,我们将这些子串视为一个集合

在计算完所有包含指定的a的所有子串后我们要进行集合合并,而根据容斥原理,集合合并时需要减去两个集合的交集,显然这个交集我们是不好求出来的。

造成这种情况的原因就是两个集合不是互斥的,放在概率论中就可以说两个条件不是独立的

所以在判断能否使用贡献法之前需要先判断一下给定的条件能否使每个元素的贡献皆相互独立

反之,如果发现条件能够使整个结果的集合划分为几个部分,那么就可以使用贡献法。(反应在题目中一般就是“唯一”,“单个”等词)

纸上学来终得钱,接下来我们就根据具体的题目分析,一起来看看所谓的“贡献法”到底有何魔力。


孤独的照片


分析

暴力枚举所有区间的话时间复杂度是O(n^2),显然行不通,但是我们发现所有的孤独的照片都有一个特点,即——同时包含两种牛,并且其中有一种牛的数量为1

很敏锐的发现题目中有唯一的条件,那么可不可以用我们上面讲的贡献法来写呢?

使用贡献法需要满足一个条件,即——我们选定的贡献的对象可以将要求的集合划分

很显然是可以的,因为两头可能孤独的牛不会出现在同一张“孤独的照片”内所以任意两头牛产生的贡献的交集为空集,所以我们可以使用贡献法。

那么接下来我们就来思考一下如何使用贡献法。

根据上面的思路,我们需要通过排列组合来每头牛的贡献就要保证当前区间只有一头此类牛。

这个简单,我们预处理出每头牛左边和右边的同类牛的位置(使用扫描法),就可以计算出对于每头牛的最长的“孤独的照片”,随后进行排列组合就好了。

这道题排列组合有一个小技巧,因为有一个要求最短区间长度为3,所以我们需要分类讨论该位置在区间两边和在区间中间的情况。


代码

/*贡献法
*/
#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
const int N = 500010;
char s[N];
int n;
int l[N], r[N];
LL ans;LL find(char x)
{int m = 0;memset(l, 0, sizeof(l)); memset(r, 0, sizeof(r));for(int i = 1; i <= n; i++)if(s[i] == x)l[i] = m, m = i;m = n + 1;for(int i = n; i >= 1; i--)if(s[i] == x)r[i] = m, m = i;// 预处理LL ls = 0;for(int i = 1; i <= n; i++){if(s[i] == x) //匹配了{int left = i - l[i] - 1, right = r[i] - i - 1; //左右长度//printf("%d %d %d ", i, left, right);ls += max((LL)0, (LL)left * right);ls += max(0, left - 1);ls += max(0, right - 1);}}return ls;
}int main()
{scanf("%d%s", &n, s + 1);ans += find('G');ans += find('H');printf("%lld", ans);return 0;
}

子串分值


分析

可以发现题目中有唯一的要求,所以我们考虑使用贡献法

那么,接下来我们要如何来划分呢?

这个简单,我们通过26个英文字母来划分,因为f函数是求贡献和,所以我们每次只求单个字符的贡献,最后加起来就一定是贡献和。

但是如果这道题是要我们判断区间内存在个数为1的字符的区间的数量,显然就无法直接用贡献法求解了,需要进一步的分析。


代码

// 贡献法,枚举26个字母,贡献求和
#include<iostream>
using namespace std;
typedef long long LL;
const int N = 100010;
char s[N];
int n, l[N], r[N];
LL idx;
LL find(char x)
{int m = 0; LL idx = 0;for(int i = 1; i <= n; i++)if(s[i] == x)l[i] = m, m = i;m = n + 1;for(int i = n; i >= 1; i--)if(s[i] == x)r[i] = m, m = i;for(int i = 1; i <= n; i++){if(s[i] == x){int left = i - l[i] - 1, right = r[i] - i - 1;idx += ((LL)left + 1) * (right + 1);}}return idx;
}int main()
{scanf("%s", s + 1);for(int i = 1; s[i]; n = i++);for(char x = 'a'; x <= 'z'; x++)idx += find(x);printf("%lld", idx);return 0;
}

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

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

相关文章

go test相关命令

在 Go 项目中&#xff0c;go test 可以用于运行整个工程中的测试文件。以下是几种方式&#xff1a; 1. 运行当前模块或整个工程的测试 go test ./..../... 表示递归测试所有子目录中的测试文件&#xff08;*_test.go&#xff09;。适用于 Go Modules 或 GOPATH 结构的项目。 …

RocketMQ 详细知识点总结

RocketMQ 详细知识点总结 1. 核心概念 1.1 基础组件 Producer(生产者) 消息的发送者支持同步、异步和单向发送方式提供事务消息功能Consumer(消费者) 消息的接收者支持Push和Pull两种消费模式支持集群消费和广播消费NameServer(命名服务) 路由注册中心无状态节点,可集…

文字也能生成视频?【蓝耘实践】:通义万相2.1文生视频

文字也能生成视频&#xff1f;【蓝耘实践】&#xff1a;通义万相2.1文生视频 上次我们已经介绍了关于在蓝耘云平台实践通义万相的基本玩法&#xff0c;这次将介绍进阶玩法&#xff0c;也就是使用文字来生成视频。 首先我们还是先注册或者登录蓝耘云平台。 通过蓝耘平台进入流…

蓝桥杯 跑步计划

问题描述 小蓝计划在某天的日期中出现 1 时跑 5 千米&#xff0c;否则只跑 1 千米。注意&#xff1a;日期中出现 1 不仅指年月日&#xff0c;也指星期。 请问按照小蓝的计划&#xff0c;2023 年小蓝总共会跑步锻炼多少千米&#xff1f; 例如&#xff1a; 5 月 1 日1 月 13 …

K8S集群新增和删除Node节点(K8s Cluster Adds and Removes Node Nodes)

实战&#xff1a;在已有K8S集群如何新增和删除Node节点 在Kubernetes (K8S) 集群中&#xff0c;Node节点是集群中的工作节点&#xff0c;它们运行着容器的实际实例。管理K8S集群中的Node节点&#xff0c;包括新增和删除节点&#xff0c;是一个常见且重要的操作&#xff0c;可以…

ASP.NET Web的 Razor Pages应用,配置热重载,解决.NET Core MVC 页面在更改后不刷新

Razor Pages应用&#xff0c;修改页面查看修改效果&#xff0c;如果没有热重载&#xff0c;改一句话跑一次&#xff0c;这个活就没法干了。 1、VS2022中的NuGet中安装RuntimeCompilation Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 需要配套你的.net sdk版本&#x…

死亡并不是走出生命 而是走出时间

目录 第一章 倒春寒 第二章 悖论与共生 第三章 坍缩与永恒 第四章 在时差里相爱 终章 你从未离开 第一章 倒春寒 2022年春天的扬州东关街&#xff0c;青衣在文昌阁古槐下调试着「时间胶囊」算法。这个能将人类记忆转化为数据流的程序&#xff0c;是他用三年时间对抗渐冻…

网络安全基础:五类安全服务、八种安全机制与OSI七层模型的全面解析

目录 引言 五类安全服务 2.1 认证服务 2.2 访问控制 2.3 数据保密性 2.4 数据完整性 2.5 不可否认性 八种安全机制 3.1 加密机制 3.2 数字签名 3.3 访问控制机制 3.4 数据完整性机制 3.5 认证交换机制 3.6 流量填充机制 3.7 路由控制机制 3.8 公证机制 OSI七层…

PhotoShop学习02

1.添加文本 这个工具栏是文字工具栏&#xff0c;快捷键是T。选择之后鼠标会变成一个竖杠外貌&#xff0c;我们可以借此在图片中写入文字。 选择后&#xff0c;上方的工具栏会变为专门调整文字工具 这个框点击旁边的小箭头可以选择我们我们电脑系统自带的字体&#xff0c;同时可…

黄土高原风蚀区解析多源数据融合与机器学习增强路径-RWEQ+集成技术在风蚀模数估算中的全流程增强策略—从数据融合到模型耦合的精细化操作指南

土壤风蚀模数估算长期面临‌模型参数不确定性高‌、‌空间异质性表达不足‌两大技术瓶颈。RWEQ集成技术框架‌&#xff0c;通过耦合地理时空分析、机器学习算法与物理过程模型&#xff0c;实现风蚀模数估算精度的系统性提升。以黄土高原典型风蚀区&#xff08;38N-40N&#xff…

BFS解决FloodFill算法

1.图像渲染 733. 图像渲染 - 力扣&#xff08;LeetCode&#xff09; 1.题目解析 有一幅以 m x n 的二维整数数组表示的图画 image &#xff0c;其中 image[i][j] 表示该图画的像素值大小。你也被给予三个整数 sr , sc 和 color 。你应该从像素 image[sr][sc] 开始对图像进行…

LeetCode(977):有序数组的平方

有序数组的平方 题目链接 题目&#xff1a;给你一个按非递减顺序排序的整数数组 nums&#xff0c;返回每个数字的平方组成的新数组&#xff0c;要求也按非递减顺序排序。 //暴力 #include<stdio.h> void sort(int *nums,int n){for(int i0;i<n;i)for(int ji1;j<…

OpenAI的“噩梦”,DeepSeek V3-0324效率革命展现中国AI雄心

3月24日晚&#xff0c;DeepSeek低调发布其V3模型的小版本更新——DeepSeek V3-0324&#xff0c;这一操作立即在社区引发热议。据悉&#xff0c;该版本已集成至DeepSeek官网、应用程序和小程序&#xff0c;用户只需关闭“Deep Thinking”功能即可体验。另该模型已在Hugging Face…

mysql创建库表插入数据演示

show databases; use zzj; create table stu (sid int primary key,name varchar(10) not null,sex varchar(2) );desc stu;insert into stu (sid, name, sex) values (1, zzj, 男);select * from stu; desc stu: select * from stu:

C语言 - 整数与浮点数运算的类型转换规则

C 语言整数与浮点数运算的类型转换规则 在 C 语言中&#xff0c;不同数据类型在运算时会进行 隐式类型转换。当 有符号整数&#xff08;int&#xff09;、无符号整数&#xff08;unsigned int&#xff09; 和 浮点型&#xff08;float、double&#xff09; 进行运算时&#xf…

用SVG绕过浏览器XSS审计

[Translated From]&#xff1a;http://insert-script.blogspot.com/2014/02/svg-fun-time-firefox-svg-vector.html SVG - <use> element SVG中的<use>元素用于重用其他元素&#xff0c;主要用于联接<defs>和alike&#xff0c;而我们却用它来引用外部SVG文件…

【构建CV图像识别系统】从传统方法到深度学习

目录 1. 图像的基本概念1.1 像素与色彩1.2 过滤与卷积 2. 图像分类与检测3. 图像特征的提取3.1 全局特征3.2 局部特征3.2.1 边缘&#xff08;Edge&#xff09;3.2.2 角点&#xff08;Corner&#xff09;3.2.3 SIFT 特征 4. 传统方法与深度学习在图像识别中的应用4.1 基于传统方…

Kubernetes高级应用之-重启策略

一、介绍&#xff0b;扩展应用&#xff08;涉及的高级资源在后续会写出来&#xff09; # Kubernetes Pod重启策略&#xff08;RestartPolicy&#xff09;全面解析 ## 一、重启策略的核心价值与重要性 在Kubernetes集群中&#xff0c;Pod重启策略&#xff08;RestartPolicy&a…

简记_单片机硬件最小系统设计

以STM32为例&#xff1a; 一、电源 1.1、数字电源 IO电源&#xff1a;VDD、VSS&#xff1a;1.8~3.6V&#xff0c;常用3.3V&#xff0c;去耦电容1 x 10u N x 100n &#xff1b; 内核电源&#xff1a;内嵌的稳压器输出&#xff1a;1.2V&#xff0c;给内核、存储器、数字外设…

matlab使用fmincon开加速

在使用 fmincon 进行优化时&#xff0c;可以通过以下方法加速优化过程。这些方法主要涉及算法选择、并行计算、减少函数调用次数等。以下是具体建议和实现方式&#xff1a; 1. 选择合适的优化算法 fmincon 支持多种优化算法&#xff0c;不同的算法适用于不同类型的优化问题。选…