【洛谷 P8715】[蓝桥杯 2020 省 AB2] 子串分值 题解(组合数学+乘法原理)

[蓝桥杯 2020 省 AB2] 子串分值

题目描述

对于一个字符串 S S S, 我们定义 S S S 的分值 f ( S ) f(S) f(S) S S S 中恰好出现一次的字符个数。例如 f ( ′ ′ a b a ′ ′ ) = 1 f\left({ }^{\prime \prime} \mathrm{aba}{ }^{\prime \prime}\right)=1 f(′′aba′′)=1 f ( ′ ′ a b c ′ ′ ) = 3 f\left({ }^{\prime \prime} \mathrm{abc}{ }^{\prime \prime}\right)=3 f(′′abc′′)=3 f ( ′ ′ a a a a ′ ′ ) = 0 f\left({ }^{\prime \prime} \mathrm{aaa} \mathrm{a}^{\prime \prime}\right)=0 f(′′aaaa′′)=0

现在给定一个字符串 S [ 0.. n − 1 ] S[0 . . n-1] S[0..n1](长度为 n n n),请你计算对于所有 S S S 的非空 子串 S [ i . . j ] ( 0 ≤ i ≤ j < n ) S[i . . j](0 \leq i \leq j<n) S[i..j](0ij<n) f ( S [ i . . j ] ) f(S[i . . j]) f(S[i..j]) 的和是多少。

输入格式

输入一行包含一个由小写字母组成的字符串 S S S

输出格式

输出一个整数表示答案。

样例 #1

样例输入 #1

ababc

样例输出 #1

21

提示

对于 20 % 20 \% 20% 的评测用例, 1 ≤ n ≤ 10 1 \leq n \leq 10 1n10;

对于 40 % 40 \% 40% 的评测用例, 1 ≤ n ≤ 100 1 \leq n \leq 100 1n100;

对于 50 % 50 \% 50% 的评测用例, 1 ≤ n ≤ 1000 1 \leq n \leq 1000 1n1000;

对于 60 % 60 \% 60% 的评测用例, 1 ≤ n ≤ 10000 1 \leq n \leq 10000 1n10000;

对于所有评测用例, 1 ≤ n ≤ 100000 1 \leq n \leq 100000 1n100000

蓝桥杯 2020 第二轮省赛 A 组 H 题(B 组 H 题)。


思路

首先获取字符串长度,并在字符串前面加上一个空格。

然后定义两个数组prenex,以及一个临时数组tmppre数组用于存储每个字符在字符串中上一次出现的位置,nex数组用于存储每个字符在字符串中下一次出现的位置,tmp数组用于在遍历过程中记录每个字符最新的位置。

接着,对字符串进行两次遍历。第一次遍历从前往后,用于填充pre数组和更新tmp数组。第二次遍历从后往前,用于填充nex数组和更新tmp数组。

每个字符在子串中可以作为一个分界点,将子串分为两部分。在前一个相同字符(不含)到当前字符之间,可以选择一个位置作为子串的左端点。同理,在当前字符(含)到后一个相同字符(不含)之间,可以选择一个位置作为子串的右端点。这样,每一对左右端点的选择,就对应了一个以当前字符为唯一重复字符的子串。

乘法原理:如果有两种选择,一种有 m m m种可能,另一种有 n n n种可能,那么这两种选择的所有可能的组合数就是 m ∗ n m * n mn

根据乘法原理,这个字符对应的子串分值,就等于左端点的选择数乘以右端点的选择数。如果一个字符的位置是 i i i,前一个相同字符的位置是pre[i],后一个相同字符的位置是nex[i],那么该字符对应的子串分值就是 ( i − p r e [ i ] ) ∗ ( n e x [ i ] − i ) (i - pre[i]) * (nex[i] - i) (ipre[i])(nex[i]i)

最后遍历字符串,计算每个字符对应的子串分值,累加得到总分值。


AC代码

#include <algorithm>
#include <cmath>
#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;const int N = 1e6 + 7;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;int n;
string s;
int pre[N], nex[N];
int tmp[30];int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> s;n = s.length();s = " " + s;for (int i = 1; i <= n; i++) {int t = s[i] - 'a';pre[i] = tmp[t];tmp[t] = i;}for (int i = 0; i < 26; i++) {tmp[i] = n + 1;}for (int i = n; i >= 1; i--) {int t = s[i] - 'a';nex[i] = tmp[t];tmp[t] = i;}ll ans = 0;for (int i = 1; i <= n; i++) {ans += 1LL * (i - pre[i]) * (nex[i] - i);}cout << ans << "\n";return 0;
}

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

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

相关文章

编写人脸检测程序

新建一个py文件&#xff0c;命名为facedetectionwithdlib.py。添加如下代码&#xff1a; 【代码 facedetectionwithdlib.py】 # -*- coding: utf-8 -*-使用dlib实现人脸检测 import face_recognition import cv2 import time# 超参数 detection_method hog # 参数值为hog/cn…

python之内存管理

前言 python中&#xff0c;万物皆对象。 因此&#xff0c;内存的管理&#xff0c;便是管理对象从创建到销毁的过程。有效地管理内存&#xff0c;既可以减少内存碎片&#xff0c;又可以避免内存泄漏等现象&#xff08;大概讲讲&#xff09;。 内存的分配 Python内部对于内存…

ChatGPT写作宝典:解锁论文创作新技能

ChatGPT无限次数:点击直达 ChatGPT写作宝典&#xff1a;解锁论文创作新技能 在当今信息爆炸的时代&#xff0c;写作已经成为人们必备的基本技能之一。无论是撰写论文、博客还是其他形式的文字内容&#xff0c;写作都扮演着重要的角色。在这样的背景下&#xff0c;ChatGPT为我们…

Vscode与Cmake搭配配置opencv使用

vscode与Cmake基本使用 下载插件 CtrlShiftp打开VSCode的指令面板&#xff0c;然后输入cmake:q&#xff0c;VSCode会根据输入自动提示&#xff0c;然后选择CMake: Quick Start选择编译器根据提示输入项目名称选择可执行文件编译项目 方式一&#xff1a;执行命令cd build cmake…

一键将自己网增加一个抖音小程序-源代码

把自己的网址链接&#xff0c;也就是你想要的一个页面转变为抖音小程序&#xff0c;让你轻松拥有一个自己的抖音小程序。 几分钟搞定。 跟着视频来操作就可以了&#xff0c;很简单。视频一定要完整看完啊&#xff0c;对于小白。 如果你的网址可能有不好过审核的页面&#xff0c…

基于python+vue的stone音乐播放器的设计与实现flask-django-php-nodejs

随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决生活上的问题&#xff0c;stone音乐播放器展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;为解决用…

Go使用Terraform 库

可以使用Terraform的Go库来在Go代码中运行Terraform。用户需要使用go get命令来获取Terraform的Go库。在Go代码中需要导入terraform包。下面是一个简单的示例代码&#xff0c;它使用Terraform的Go库来创建和销毁一个AWS EC2实例&#xff1a; package mainimport ("contex…

surfaceview遮挡了上面的控件显示的解决方法

最近在项目中使用到surfaceview做视频的实时流&#xff0c;遇到一个很奇葩的效果 &#xff0c;在使用surfaceview因为surfaceview是双缓存机制&#xff0c;所以他需要设置 setZOrderOnTop(true); 让他显示在所依赖的窗口的最顶层才能更好的显示 这个是在surfaceview里面找到的…

华为配置WLAN 802.1X认证实验

配置WLAN 802.1X认证示例 组网图形 图1 配置802.1X认证组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤 业务需求 用户接入WLAN网络&#xff0c;使用802.1X客户端进行认证&#xff0c;输入正确的用户名和密码后可以无线上网。且在覆盖区域内移动发生漫游时&…

每日OJ题_子数组子串dp⑥_力扣978. 最长湍流子数组

目录 力扣978. 最长湍流子数组 解析代码 力扣978. 最长湍流子数组 978. 最长湍流子数组 难度 中等 给定一个整数数组 arr &#xff0c;返回 arr 的 最大湍流子数组的长度 。 如果比较符号在子数组中的每个相邻元素对之间翻转&#xff0c;则该子数组是 湍流子数组 。 更正…

MySQL面试题--MySQL内部技术架构

目录 1.Mysql内部支持缓存查询吗&#xff1f; 2.MySQL8为何废弃掉查询缓存&#xff1f; 3.替代方案是什么&#xff1f; 4.Mysql内部有哪些核心模块组成&#xff0c;作用是什么&#xff1f; 5.一条sql发送给mysql后&#xff0c;内部是如何执行的&#xff1f;&#xff08;说…

MYSQL 同步到ES 如何设计架构保持一致性

简单使用某个组件很容易&#xff0c;但是一旦要搬到生产上就要考虑各种各样的异常&#xff0c;保证你方案的可靠性&#xff0c;可恢复性就是我们需要思考的问题。今天来聊聊我们部门在 MYSQL 同步到ES的方案设计。 在面对复杂条件查询时&#xff0c;MYSQL往往显得力不从心&…

Gitlab介绍

1.什么是Gitlab GitLab是一个流行的版本控制系统平台&#xff0c;主要用于代码托管、测试和部署。 GitLab是基于Git的一个开源项目&#xff0c;它提供了一个用于仓库管理的Web服务。GitLab使用Ruby on Rails构建&#xff0c;并提供了诸如wiki和issue跟踪等功能。它允许用户通…

从0到1实现RPC | 02 RpcConsumer的远程调用

一、RPC的简化版原理如下图&#xff08;核心是代理机制&#xff09;。 1.本地代理存根: Stub 2.本地序列化反序列化 3.网络通信 4.远程序列化反序列化 5.远程服务存根: Skeleton 6.调用实际业务服务 7.原路返回服务结果 8.返回给本地调用方 二、新建一个模块rpc-demo-c…

Puppet 2024年度报告:平台工程发掘 DevOps 无限潜质

Puppet 于本周发布了一份2024年的 DevOps 现状报告 The State of DevOps Report: The Evolution of Platform Engineering。该报告显示了平台工程的持续成熟&#xff0c;43%的受访者报告称他们的平台团队已经存在至少3-5年。 自2012年以来&#xff0c;Puppet 每年发布的关于 De…

后端程序员入门react笔记(九)- react 插件使用

setState setState引起的react的状态是异步的。操作完毕setState之后如果直接取值&#xff0c;可能取不到最新的值&#xff0c;我们举个例子console.log(this.state.num)打印的值&#xff0c;总是上一次的值而不是最新的。 import React, {Component} from react; class Ap…

基于ArcGIS的2015-2020辽宁省土地利用变化分析

数据准备 栅格转面 运行ArcToolbox&#xff0c;打开【转换工具】&#xff0c;选择【从栅格转出】里面的【栅格转面工具】&#xff0c;调出面板进行参数设置。输入栅格选择裁剪的2015年中国土地利用遥感监测数据&#xff08;…

Kafka批量消费

在Spring Kafka中&#xff0c;使用KafkaListener注解处理批量信息时&#xff0c;首先需要开启批量监听模式&#xff0c;并配置相应的consumer参数来控制批量消费行为。以下是配置和处理批量消息的基本步骤&#xff1a; 配置Kafka消费者工厂&#xff1a; 设置batchListener属性为…

数据挖掘与分析学习笔记

一、Numpy NumPy&#xff08;Numerical Python&#xff09;是一种开源的Python库&#xff0c;专注于数值计算和处理多维数组。它是Python数据科学和机器学习生态系统的基础工具包之一&#xff0c;因为它高效地实现了向量化计算&#xff0c;并提供了对大型多维数组和矩阵的支持…

复习Day1

92. 递归实现指数型枚举 - AcWing题库 #include <bits/stdc.h> using namespace std; const int N17; int n; bool vis[N];//记录某一个数是否出现过 void dfs(int dep){// if(vis[dep])continue;//没有这一句 因为一定不会有已经选过的数if(depn1){for(int i1;i<n;i…