当前位置: 首页 > news >正文

abc418d

AtCoder ABC418 D XNOR Operation

link

题意

给定一个长度为 \(n\) 的 01 串 \(s\),每次可以选择相邻的两个位置。如果两个位置字符相同,把它们缩成 \(1\),否则缩成 \(0\)。求 \(s\) 中有多少个子串经过操作可以变成 \(1\)\(1\leq n\leq 2\times 10^5\)

题解

动态规划。令 \(f_{i,0/1}\) 表示以 \(i\) 结尾且最终变为 \(0/1\) 的子串个数。当 \(s_i=1\) 时,显然 \(f_{i,0}=f_{i-1,0},f_{i,1}=f_{i-1,1}+1\)。当 \(s_i=0\) 则有 \(f_{i,0}=f_{i-1,1}+1,f_{i,1}=f_{i-1,0}\)。而最终答案就是 \(\sum f_{i,1}\)。复杂度 \(O(n)\)。aclink。

代码

#include<bits/stdc++.h>
#define i64 long long
#define L(a,b,c,d) for(int a=b;a<=c;a+=d)
#define R(a,b,c,d) for(int a=b;a>=c;a-=d)using namespace std;
const int N=2e5+5;void solve();
int n,f[N][2];
i64 ans;
char s[N];signed main(){int Test=1;
//  scanf("%d",&Test);while(Test--) solve();return 0;
}void solve(){scanf("%d%s",&n,s+1);L(i,1,n,1){if(s[i]=='1'){f[i][1]=f[i-1][1]+1;f[i][0]=f[i-1][0];}else{f[i][1]=f[i-1][0];f[i][0]=f[i-1][1]+1;}ans+=f[i][1];}printf("%lld\n",ans);
}
http://www.hskmm.com/?act=detail&tid=11840

相关文章:

  • Chapter 6 Joining Images
  • 动态主机配置协议(DHCP)中的中继机制及其配置
  • DDD - 概念复习
  • 软件工程第二次作业
  • CSP-J1S1_2025
  • Vdd Vcc
  • 基于ThinkPHP实现动态ZIP压缩包的生成
  • 使用Java实现用户的注册和登录流程
  • Windows安装Kafka(kafka_2.12-3.9.1),配置Kafka,以及遇到的困难解决方案
  • 准备工作之动态内存分配[基于郝斌课程]
  • 2025.6第一套六级听力生词
  • CSP-S 2025游记
  • atof() - 字符串转double类型
  • 完整教程:还在为第三方包 bug 头疼?patch-package 让你轻松打补丁!
  • Kubernetes(k8s)高可用性集群的构建
  • 在CentOS环境下升级GCC编译器
  • 详细介绍:深圳比斯特|电池组PACK自动化生产线厂家概述
  • Chapter 4 Shapes and Texts
  • 手动清除Ubuntu系统中的内存缓存
  • 消除 Vue SPA 刷新导致 404 的问题
  • Docker / Kubernetes 图形化管理工具--------Portainer
  • 【Excel】创建下拉选项框
  • 不定高元素动画实现方案(中)
  • 技术文章
  • 插值相关
  • 密码学学习记录(三)
  • 详解scheduleAtFixedRate 与 scheduleWithFixedDelay 的区别
  • [题解]P11095 [ROI 2021] 旅行 (Day 2)
  • DDR5内存时序参数对照表
  • Linux CentOS 第三方扩展模块编译并安装