Balanced Substring 题解

考虑将 0 权值设为 1-1,将 1 权值设为 11

题目即求一段最长子串使得这一串的权值和为 00

考虑 pip_i 为权值,其中 1in1 \leq i \leq n,前缀和为 si=j=1ipis_i = \sum \limits_{j=1}^i p_i。特别地,sum0=0sum_0=0

即求 rl+1r-l+1 最大的 (l,r)(l,r) 使得 sumr=suml1sum_r = sum_{l-1}

然后枚举每一个 ll,显然可以 O(1)O(1) 算出最靠后的和它相同的 rr,求最大值即可。

复杂度 O(n)O(n)

#include <bits/stdc++.h>
using namespace std;

const int N = 3e5 + 5;

int sum[N];
vector<int> v[N];

string s;

int main()
{
	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	cin >> s >> s;
	int n = s.size() - 1;
	for (int i = 0; i <= n; i++)
	{
		sum[i] = (s[i] == '0' ? -1 : 1) + (i == 0 ? 0 : sum[i - 1]);
		v[sum[i] + n].push_back(i);
	}
	int ans = 0;
	for (int i = 0; i <= n; i++)
	{
		if (sum[i] == 0) ans = max(ans, i + 1);
		if (*(--v[sum[i] + n].end()) == i) continue;
		ans = max(ans, *(--v[sum[i] + n].end()) - i);
	}
	printf("%d\n", ans);
	return 0;
}
posted @   HappyBobb  阅读(2)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示