当前位置: 首页 > 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.zskr.cn/news/8910.html

相关文章:

  • Chapter 6 Joining Images
  • 动态主机配置协议(DHCP)中的中继机制及其配置
  • 进一步理解自适应卡尔曼滤波(AKF) - 教程
  • 完整教程:基于Spring Boot植物销售管理系统的设计与实现
  • Vdd Vcc
  • 使用Java实现用户的注册和登录流程
  • Windows安装Kafka(kafka_2.12-3.9.1),配置Kafka,以及遇到的困难解决方案
  • Chapter 5 Wrap Perspective
  • 手动清除Ubuntu系统中的内存缓存
  • 插值相关
  • 详解scheduleAtFixedRate 与 scheduleWithFixedDelay 的区别
  • 模拟输入的过程
  • Manim实现水波纹特效
  • CSP 2025 S1 游记
  • JS之使用for...of赋值失败的原因分析
  • Linux /lib/modules/$(uname -r)/ 目录功能作用详解
  • 软件工程第二次作业_个人项目
  • Chapter 3 Resize and Cropping
  • 解决Kubernetes集群中master节点无法与node节点通信的策略
  • 配置Nginx以支持Websocket连接的方法
  • Extundelete工具恢复数据
  • 最新!!!MySQL环境搭建(windows系统) - 详解
  • SQLite数据库 - 教程
  • 【Bluedroid】A2DP Source 音频流暂停流程解析[3]:AVDTP 协议中 Suspend Accept 响应的处理流程与建立分析(Suspend Accept)
  • Mysql查询条件里的字符串不加引导索引失效
  • 详细介绍:在Ubuntu平台搭建RTMP直播服务器使用SRS简要指南
  • 实用指南:在 k8s 上部署 Kafka 4.0 3节点集群
  • 完整教程:VLAN划分——TRUNK
  • 现代操作系统-音频处理技术1 Linux驱动底层
  • 智元首次明确七人合伙人团队