⭐蓝桥杯高频题单——1.子串分值和(枚举 / 计算贡献 / 前缀数组 / 哈希思想)

⭐子串分值和⭐

在这里插入图片描述
在这里插入图片描述

方法一: 暴力

在做这道题的时候我想到了以前力扣做的一道Leetcode.78. 子集__DFS算法剖析讲解。初始我的想法是通过深搜找到所有可能的子串,再对他们分别计算f(S),从而得到所有的f(S)之和。但是经过思考发现,这里找子串的过程和找子集的方式是完全不同的,问题就在于子集可以是不连续的几个数字组成,而子串这里一定是连续的。因此可知,这里就不需要麻烦的深搜来帮助完成了,因为找连续序列情况下的枚举是非常简单的,我们只需要对子串的起点和终点进行枚举即可实现对所有可能的序列进行搜寻,因此这里我们通过两个for循环即可解决问题,搭配哈希思想计算每一个序列的f(S)值即可。

Code:

#include <iostream>
#include <string>
#define int long long
// #include <bits/stdc++.h>
using namespace std;
signed main()
{
  string s;
  cin >> s;
  int sum = 0;
  int len = s.size();
  for(int i=0;i<len;i++){
    for(int j=i;j<len;j++){
      int hash[26] = {0};
      for(int index=i;index<=j;index++){
        hash[s[index] - 'a']++;
      }

      for(int temp=0;temp<26;temp++){
        if(hash[temp] != 0)
          sum++;
      }
    }
  }
  cout << sum;
  return 0;
}

在这里插入图片描述

方法二: 前缀和 + 数学法分析

我们不妨先对题目所给定的ababc序列进行简要的分析,可以看到其子序列及每个子序列对应的f(S)一共为:
在这里插入图片描述

⭐通过观察,我们可以发现,当相同字母出现在一个序列中时,其只会贡献一个价值,因此对于如“aba”等序列,其相当于只有一个a能成功贡献,因此第二个a无法贡献。因此我们发现如“aba”序列中,对于第二个a来说,其等价于“_ba”的,所以即“abc”并不是第三个a的有效序列,为它的无效序列

⭐同时我们可以化此大问题为小问题,即我们如果可以算出总序列中,每一个字母在其所构成的所有序列中所贡献的有效值之和,进行累加即可得到总序列的贡献值f(S)。此时我们发现不用像方法一那样一个一个的枚举起点终点,我们可以一个字母一个字母的去探寻该位置的字母可能生成的所有有效序列,有效序列的个数即为该位置的字母的有效贡献值。

具体流程即:

  1. 我们从左方第一个字母a开始,对其来说,其起点只可为自己,而对其来说,其由于为“先手”,所以像"aba",“abab”,“ababc”含有a的序列均为“先手用a”的有效序列,所以可知其终点可取0,1,2,3,4,即五种,所以1 * 5 = 5种(起点种类个数 X 终点种类个数 = 能组成的序列个数)为该位置字母的有效贡献值(能组成的有效序列个数)。
  2. 接着对第二位置b,同上,其起点可为0,1(因为左方0位置与其字母值不同,所以向左方取不会出现无效序列),由于为先手,所以终点可为1,2,3,4,即2 * 4 = 8种。
  3. 对第三位置a,对其分析,其起点只可为1,2,不可为0,这是因为0位置为a与其字母值相同,此时它即为“后手”,所以带上0位置的所有序列其都被“先手”拿去作为它的有效序列了,因此对后手来说带上0位置的序列均为无效序列,不计算贡献。而终点可同上延展到最后,因为对于后方来说它算先手,先手具有强大的率先夺取能力!
  4. 对第四位置b,对其分析,其起点可为2,3,不可为1,之所以不可为0是因子串具有连续性,一断即断,其余分析同上,终点可延展到最后。
  5. 对第五位置c同理。

总结一下上面的流程,即对于字母相同的先手和后手,先手可率先拿走其能拿的所有序列,而后手只能拿不带先手的序列;对于字母不同的先手和后手,其不为竞争关系可相互共存;且某一位置的字母对于其后面的所有字母均为绝对先手;

⭐因此可知算法的核心即将枚举起点和终点改为直接定位起点和终点可能的取值个数,继而使用乘法代替加法,而此算法的计算机算法核心即为维护一个前缀数组pre_same_first_char,pre_same_first_char[s[i] - 'a'] = i 即代表与序列s中第i个位置所对应的字母值相同的相对先手的位置,即找到起点取值的断点(前一个字母值相同的先手位置)即可。

Code:

#include <iostream>
#include <string>
#define int long long
// #include <bits/stdc++.h>
using namespace std;
signed main()
{
  string s;
  cin >> s;
  int sum = 0;
  int pre_same_first_char[26];
  for(int i=0;i<26;i++){
    pre_same_first_char[i] = -1;
  }

  int len = s.size();
  for(int i=0;i<len;i++){
    if(pre_same_first_char[s[i] - 'a'] == -1){
      sum += (i+1) * (len-i);
      pre_same_first_char[s[i] - 'a'] = i;
    }
    else{
      sum += (i - pre_same_first_char[s[i] - 'a']) * (len-i);
      pre_same_first_char[s[i] - 'a'] = i;
    }
  }
  cout << sum;
  return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT让现在的软件都土掉渣了

我们家有两个娃&#xff0c;每次我们想要出去时订个酒店时都好麻烦。我在某程上找&#xff0c;我先看有没有家庭房&#xff0c;但家庭房很少&#xff0c;而且有些家庭房实际上只能睡得下两大一小。普通房间能不能睡得下四个人&#xff0c;那可是得查看很多信息&#xff0c;如床…

SpringBoot——SB整合mybatis案例(残缺版本)第四集(真*大结局)

基础登录功能 要求输入用户名和密码然后从对应的数据库员工表当中查询是否存在对应员工: 查询成功 查看接口文档 响应数据中有一个JWT令牌。 实现思路 新建一个LoginController用于接收登录请求&#xff0c;然后调用EmpService中的借口进行查询操作。 三层架构的代码 Pos…

病毒丨熊猫烧香病毒分析

作者丨黑蛋 一、病毒简介 病毒名称&#xff1a; 熊猫烧香 文件名称&#xff1a; 40fee2a4be91d9d46cc133328ed41a3bdf9099be5084efbc95c8d0535ecee496 文件格式&#xff1a; EXEx86 文件类型(Magic)&#xff1a; MS-DOS executable 文件大小&#xff1a; 29.30KB SHA256&…

【阅读论文】USAD:多变量时间序列上的无监督异常检测

USAD : UnSupervised Anomaly Detection on Multivariate Time Series 摘要 IT系统的自动监控是Orange目前面临的挑战。考虑到其IT运营所达到的规模和复杂性&#xff0c;随着时间的推移&#xff0c;用于推断正常和异常行为的测量所需的传感器数量急剧增加&#xff0c;使得传统…

【C++】内存管理+模板

前言&#xff1a; 本章将详细讲解C内存管理和模板的实现。 第一部分我们讲解C内存管理&#xff0c;C语言中有malloc/calloc/realloc等开辟空间和free释放空间&#xff0c;那么C将符合实现呢&#xff1f; 第二部分我们会一起来初步认识模板与泛型编程&#xff0c;并详细探讨函…

微服务高级篇【1】之微服务保护

文章目录前言一 初识Sentinel1.1 雪崩问题1.2 解决方法1.3 小结1.4 服务保护技术对比1.5 Sentinel介绍1.6 Sentinel安装1.7 微服务整合Sentinel二 测试工具&#xff1a;Jmeter2.1 Jmeter安装和配置2.2 Jmeter快速入门2.2.1 设置中文语言2.2.2 设置Jmeter桌面快捷图标2.3 Jmeter…

已经提了离职,还有一周就走,公司突然把我移出企业微信,没法考勤打卡, 还要继续上班吗?...

黎明前的黑暗最容易出事&#xff0c;离职前的几天也最容易出幺蛾子&#xff0c;比如下面这位网友的遭遇&#xff1a;已经提了离职&#xff0c;还有一周就正式离职了&#xff0c;公司突然把我移出企业微信&#xff0c;没法考勤打卡了&#xff0c; 还要继续上班吗&#xff1f;该怎…

BGP小型实验

实验分析 1.主要考察的是对BGP配置的熟练 2.实验需要在R1与R5分别发布一条路由可以在BGP 中使用network 网段 掩码命令 3.R1与R2,R4与R5是EBGP&#xff0c;而R2,R3,R4是IBGP 实验操作 1.配置接口ip,与环回路由 以R1为例 2.AS内部需要实现非直连的建立是需要保证IBGP内部是通的所…

蓝桥杯30天真题冲刺|题解报告|第三十天

大家好&#xff0c;我是snippet&#xff0c;今天是我们这次蓝桥省赛前一起刷题的最后一天了&#xff0c;今天打了一场力扣周赛&#xff0c;前面3个题都是有思路的&#xff0c;第三个题只过了一半的案例&#xff0c;后面看完大佬们的题解彻悟&#xff0c;下面是我今天的题解 目录…

蓝桥杯备考

数论&#xff1a;判断素数&#xff0c;鸽笼定理&#xff0c;抽屉理论 注意事项&#xff1a; long类型的数后面要加L long s 2658417853L; 保留几位小数&#xff1a; System.out.printf(“%.2f”, arg); 四舍五入问题&#xff1a;比如保留两位小数&#xff0c;就在数的后面再…

java基础知识汇总

目录 1、Java基础语法 1、类型转换问题 1. 运算符 1.1 算术运算符&#xff08;理解&#xff09; 1.2 赋值运算符&#xff08;应用&#xff09; 1.3 自增自减运算符&#xff08;理解&#xff09; 1.4 关系运算符&#xff08;应用&#xff09; 1.5 逻辑运算符&#xff08…

【CSS】清除浮动 ④ ( 清除浮动 - 使用双伪元素清除浮动 | 代码示例 )

文章目录一、清除浮动 - 使用双伪元素清除浮动二、代码示例一、清除浮动 - 使用双伪元素清除浮动 为 .clearfix:before 和 .clearfix:after 并集选择器 , 设置如下样式 : /* 清除浮动 - 使用双伪元素清除浮动 */.clearfix:before,.clearfix:after {content: "";displ…

ERTEC200P-2 PROFINET设备完全开发手册(1)

本教程为ERTEC200P-2的基础开发教程&#xff0c;可以掌握PN设备开发的基本流程。虽然没有涉及PN协议的详细解析&#xff0c;但是希望根据本文档多多练习&#xff0c;熟能生巧&#xff0c;逐渐能够掌握PN设备开发。 &#xff08;注意&#xff1a;本手册基于西门子DEVKIT V47协议…

oracle导入的表中文名称乱码无法删除导致删除用户也失败

由于一开始弄数据库的时候忘记设置编码格式&#xff0c; 导致导入dmp文件之后带中文的表名变成了乱码 然后plsql右键删除表显示表不存在 一开始的时候寻思备份下表结构跟表数据 直接删除用户完事了 删除用户报递归遍历错误 寻思重装这个数据库太过于耗时 不值当的 就是看那几…

【JWT鉴权】如何来写一个token令牌认证登录?

目录一. &#x1f981; 话题引入1.2 什么是JWT&#xff1f;二. &#x1f981; 技术体现2.1 引入依赖2.2 编写JWT工具类2.3 编写登录方法2.4 编写JWT拦截器验证令牌2.5 编写要配置拦截的接口三. &#x1f981; 话题终结一. &#x1f981; 话题引入 在做项目过程中&#xff0c;我…

【halcon】为啥匹配到ROI外面去了?

背景 匹配到ROI外面去了 中心恰好在roi有效区域内&#xff01;&#xff08;粉色是ROI区域&#xff09; 网上查到的资料&#xff01; PaintRegion改变外部环境 //HOperatorSet.ReduceDomain(image, ho_ProductRegionAll, out imgReduced); //替换为&#xff1a; HObject all…

Web前端 HTML、CSS

HTML与CSSHTML、CSS思维导图一、HTML1.1、HTML基础文本标签1.2、图片、音频、视频标签1.3、超链接、表格标签1.4、布局1.5、表单标签1.6、表单项标签综合使用1.7、HTML小结二、CSS&#xff08;简介&#xff09;2.1、引入方式2.2、选择器2.3、CSS属性Web前端开发总览 Html&…

Linux基础操作 常用命令 Centos

Linux 1.Linux的引言 Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。伴随着互联网的发展&#xff0c;Linux得到了来自全世界软件爱好者、组织、公司的支持。它除了在服务器操作系统方面保持…

面试题-学习网络协议必备:七层模型与协议之间的映射关系

一、概念 OSI七层模型是计算机网络中的一种标准化分类和描述方式&#xff0c;它将网络协议划分为不同的层次&#xff0c;每个层次负责不同的功能。这种模型被广泛应用于网络设计、开发和维护&#xff0c;以便于不同系统之间的互操作性和相互通信。 二、各层介绍 第一层&#x…
最新文章