【枚举区间思想+DP】子串的子序列

news2024/9/22 4:20:11

F-子串的子序列_牛客小白月赛62 (nowcoder.com)

题意:

 

思路:

复盘一下应该有的思路:

首先n^2枚举肯定超时,我们枚举的是一个区间

枚举区间有一些trick:

1.枚举其中一个右(左)端点,O(1)或O(logn)计算满足条件的左(右)端点个数 ,可以组合数学 or DP 计算

2.单独计算每个元素的贡献,O(1)或O(logn)计算合法区间的左端点和右端点匹配个数,这种一般是乘法原理

在这里我们用到的是第一种思想

我们去枚举右端点r,然后计算满足条件的左端点的个数

我就想到这里,甚至连DP都没想到

这里的DP并不是传统意义的子序列DP,也就是说,并不是枚举两个指针然后转移(LIS),也不是统计前缀满足某个性质的子序列的最值(接龙数列 or 绝世好题),这里用的是状态机DP

设dp[i][0/1][0/1]表示,前i个字符,a的数量的奇偶性是0/1,ac的数量的奇偶性是0/1的子串个数

为什么是这样设计的,其实一开始想的应该只是ac的数量的奇偶性,但是发现这样不能算贡献,考虑多一个字符c,贡献还与前缀a的数量的奇偶性有关,所以应该还有加上一维

这里告诉我们,在考虑计算贡献的DP时,考虑多一格,然后思考如何计算贡献

然后转移的时候注意这是子串数量,所以应该从i-1转移

(看代码)为什么一开始要++,因为考虑新加的字符自成一个区间

还有一个坑点:

然后统计答案的时候会把ac子序列个数为0的区间个数算进去,因此我们需要减去这些区间

这个怎么做?同样也是那个枚举区间的trick,我们去枚举左区间,右侧ac的c左边那格-i+1就是区间个数了,统计一下即可

Code:

#include <bits/stdc++.h>

#define int long long

using namespace std;

using i64 = long long;

const int mxn=5e5+10;
const int mxe=5e5+10;
const int mod=1e9+7;

string s;

int N;
int pre_a[mxn],pre_c[mxn];
int dp[mxn][2][2];

int no_ac(){
    int res=0;
    for(int i=1;i<=N;i++){
        if(s[i]=='a'){
            pre_a[i]=i;
            pre_c[i]=pre_c[i-1];
        }else if(s[i]=='c'){
            pre_c[i]=i;
            pre_a[i]=pre_a[i-1];
        }else{
            pre_a[i]=pre_a[i-1];
            pre_c[i]=pre_c[i-1];
        }
    }
    for(int r=1;r<=N;r++) res+=r-(pre_a[pre_c[r]]+1)+1;
    return res;
}
void solve(){
    cin>>s;
    N=s.size();
    s=" "+s;
    int ans=0;
    for(int i=1;i<=N;i++){
        if(s[i]=='a'){
            dp[i][1][0]++;
            dp[i][1][1]+=dp[i-1][0][1];
            dp[i][1][0]+=dp[i-1][0][0];
            dp[i][0][1]+=dp[i-1][1][1];
            dp[i][0][0]+=dp[i-1][1][0];
        }else if(s[i]=='c'){
            dp[i][0][0]++;
            dp[i][1][1]+=dp[i-1][1][0];
            dp[i][1][0]+=dp[i-1][1][1];
            dp[i][0][1]+=dp[i-1][0][1];
            dp[i][0][0]+=dp[i-1][0][0];
        }else{
            dp[i][0][0]++;
            for(int j=0;j<2;j++){
                for(int k=0;k<2;k++){
                    dp[i][j][k]+=dp[i-1][j][k];
                }
            }
        }
        ans+=dp[i][1][0]+dp[i][0][0];
    }
    cout<<ans-no_ac()<<'\n';
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int __=1;//cin>>__;
    while(__--)solve();return 0;
}

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

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

相关文章

基于simulink车辆动力学可视化仿真(附源码)

一、前言 车辆动力学是研究汽车在行驶过程中的运动学和力学特性的学科。它研究车辆在不同路面条件、不同驾驶情况下的加速、制动、转向等运动状态&#xff0c;并通过建立数学模型来分析和优化车辆的性能和安全性。车辆动力学是汽车工程、机械工程和物理学等学科的交叉领域&…

【C语言11】文件操作(fgtec,fputc,fgets,fputs,fscanf,fprintf)

1.什么是文件 磁盘上的文件是文件。 但是在程序设计中&#xff0c;我们一般谈的文件有两种&#xff1a;程序文件、数据文件&#xff08;从文件功能的角度来分类的&#xff09;。 程序文件 包括源程序文件&#xff08;后缀为.c&#xff09;,目标文件&#xff08;windows环境后…

unittest教程__expectedFailure预期用例失败(5)

在断言用例执行结果时&#xff0c;会出现预期结果与实际结果不一致的情况&#xff0c;此时我们明确知道用例执行结果为FAIL&#xff0c;不想看到打印错误信息怎么办&#xff1f; 使用装饰器unittest.expectedFailure标记该用例。 import unittestclass Demo(unittest.TestCas…

Tcl常用命令备忘录-format与scan

format 语法&#xff1a;format formatString arg arg ... 参数介绍&#xff1a; formatString&#xff1a;格式化字符串&#xff0c;使用各种标识符和修饰符进行格式化。arg&#xff1a;被格式化的变量或字符串。 Tcl语言中的format命令可以用来格式化字符串输出&#xff…

Autosar代码解析-Source Insight的使用

文章目录 一、Source Insight简介二、Autosar代码查看三、解决办法一、Source Insight简介 Source insight是一款简洁、强大的轻量级代码浏览编辑器,启动快、使用便捷,很多程序员应该都使用过!它几乎支持所有的语言,比如C、C++、ASMA汇编、HTML等,能创建并维护其高性能的符…

【软件测试】性能测试服务端—排查指标问题(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 软件性能测试的目…

【数据类型】C#和Sql Server、Mysql、Oracle等常见数据库的数据类型对应关系

&#x1f3c6;&#x1f3c6;这是小5写的第二篇城市领跑者文章&#xff0c;一起为所在城市领跑助力吧&#xff01; &#x1f3c6;&#x1f3c6;在实际项目中&#xff0c;不管是用C#后端编程语言也好&#xff0c;还是Java后端编程语言&#xff0c;都可能会用到不同端的数据类型转…

JAVA-MAVEN初学者教程(配置、pom.xml、依赖管理等)

目录 认识MAVEN安装&配置MAVENwindows安装MAVENMAVEN的配置本地仓库 localRepository镜像 mirrors代理仓库 respositories代理 proxies IDEA配置MAVEN&#xff08;一个module&#xff09; MAVEN生命周期install下载包 模块的pom.xml坐标gav打包方式 package属性值 properti…

2023最全Java面试八股(涵盖所有Java核心面试知识点),立刻收藏

2022已成为过去式&#xff0c;不论这一年好与坏&#xff0c;我们都需要抓住新一年的机会&#xff0c;跳槽涨薪&#xff0c;还是学习提升&#xff01;先给自己定一个小目标&#xff0c;然后再朝着目标去努力就完事儿了&#xff01; 为了帮大家节约时间&#xff0c;给大家搞来了2…

9.反射和Lambda表达式

目录 一、反射 1.反射是什么 2.反射操作的四个核心类&#xff08;都处在java.lang.reflect&#xff09; 3.在java中获取一个类的class对象一共有三种途径&#xff1a; 4.想通过反射来操作类或者对象&#xff0c;第一步就是要获得该类的class对象。 5.Constructor应用 6.Met…

LabVIEW开发光线追踪可视化分段反射器测试台

LabVIEW开发光线追踪可视化分段反射器测试台 为了满足美国国家航空航天局&#xff08;NASA&#xff09;对未来望远镜的要求&#xff0c;新的红外空间天文台将在哈勃太空望远镜使用寿命结束后取代其。作为HST的继任者&#xff0c;詹姆斯韦伯太空望远镜&#xff08;JWST&#xf…

零基础小白如何快速入门网络安全/Web安全?

前言 网络安全现在是朝阳行业&#xff0c;缺口是很大。不过网络安全行业就是需要技术很多的人达不到企业要求才导致人才缺口大 初级的现在有很多的运维人员转网络安全&#xff0c;初级也会慢慢的卷起来&#xff0c;但是岗位多不用怕&#xff0c;以后各大厂也都会要网络安全人…

scratch lenet(6): feature_map可视化的C语言实现

scratch lenet(6): feature_map可视化的C语言实现 文章目录 scratch lenet(6): feature_map可视化的C语言实现1. 目的2. FeatureMap 的归一化2.1 公式2.2 代码实现2.3 代码调用 3. 可视化结果4. References 1. 目的 将卷积层(Convolution)、下采样层&#xff08;SubSampling&a…

Linux系统之安装Ward服务器监控工具

Linux系统之安装Ward服务器监控工具 一、Ward介绍1.1 Ward简介1.2 Ward特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、部署java环境3.1 jdk下载地址3.2 解压jdk安装包3.3 复制二进制文件3.4 配置环境编辑3.5 查看java版本 四、下载ward的jar包4.1 下载软件包4.2 …

阿里巴巴内部10w+字总结的Java面试题,全是面试官必问技术

献上熬夜整理最新“10w字总结的Java面试题&#xff08;附答案&#xff09;”够你刷&#xff01; 春招升级打怪拿offer&#xff0c;10w字总结的Java面试题&#xff08;附答案&#xff09;够你刷 其包含的内容模块有&#xff1a;基础、JVM、多线程与高并发、Spring、MyBatis、Spr…

APP自动化测试高级定位技巧,我敢打赌你一定不知道

目录 高阶定位-Xpath 包含-contains() XPath 轴 XPath 运算符 AND OR 高阶定位-CSS css selector 定位介绍 css selector 用法 示例 iOS css selector 定位 Toast 识别 Toast 是什么 Toast 定位 Toast 定位 显示等待 使用lambda表达式 总结三种等待方法 高阶定…

Ansible自动化运维工具之playbook剧本编写含lnmp

1.playbook的相关知识 1.1 playbook 的简介 playbook是 一个不同于使用Ansible命令行执行方式的模式&#xff0c;其功能更强大灵活。简单来说&#xff0c;playbook是一个非常简单的配置管理和多主机部署系统&#xff0c;不同于任何已经存在的模式&#xff0c;可作为一个适合部…

【黑马头条】解决P11@EnableDiscoveryClient注解无法导入爆红、bootstrap.yml配置文件图标无法显示成带云朵的小绿叶图标

本期目录 1. 问题描述2. 问题原因3. 解决方法 1. 问题描述 如果按黑马老师给的 heima-leadnews-service 模块的 pom 文件所写的依赖&#xff0c;会发现有 2 个 Bug &#xff1a; 首先&#xff0c;启动类 UserApplication 上的服务发现开关注解 EnableDiscoveryClient 不存在。 …

知识复盘(Session、Mysql、Servlet、Jsp、SSM)

一、会话跟踪技术(Session Tracking&#xff09; 1.为什么会出现会话机制? 目前主流的通讯方式就是客户端和服务端之间进行通信&#xff0c;而这种通信是通过Http协议实现的&#xff0c;但Http协议本身是无状态的&#xff0c;所以客户端每发送一次请求到服务器都会被当做一个…

windows上的Linux系统WSL2

目录 简介 安装 简介 适用于 Linux 的 Windows 子系统 (WSL) 可让开发人员直接在 Windows 上按原样运行 GNU/Linux 环境&#xff08;包括大多数命令行工具、实用工具和应用程序&#xff09;&#xff0c;且不会产生传统虚拟机或双启动设置开销&#xff0c;用于快速的多平台验…