CF 873 B

原题链接:

Problem - B - Codeforces

题意:

有一个长度为 n 的 01 字符串,问最长的字串 [l,r] 使得 l~r 中 0 的个数等于 1 的个数

解法:

可以把 0 看成 -1。那题目就可以转换成,最长和为 0 的字串,那就是说两点的前缀和相等。

用 vector[] 把每个前缀和的编号存进去。(可能为负数,所以可以把前缀和先加 1e5)

Code :

 # include <bits/stdc++.h>
//# define int long long
# define pb push_back
# define db double
using namespace std;
 
int n, arr[100005], s[100005], ans = 0;
 
vector <int> g[200005];
 
int main(){
	scanf("%d", &n);
	s[0] = 1e5;
	g[s[0]].pb(0);
	for (register int i = 1;i <= n;i++){
		scanf("%1d", &arr[i]);
		if (arr[i] == 0) arr[i] = -1;
		s[i] = s[i-1] + arr[i];
		g[s[i]].pb(i);
	}
	for (int i = 0;i <= 2e5;i++) if (g[i].size()) ans = max(ans, g[i][g[i].size()-1] - g[i][0]);
	cout << ans;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值