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 @ 2022-11-05 11:55  HappyBobb  阅读(7)  评论(0)    收藏  举报  来源