Balanced Substring 题解
考虑将 0 权值设为 ,将 1 权值设为 。
题目即求一段最长子串使得这一串的权值和为 。
考虑 为权值,其中 ,前缀和为 。特别地,。
即求 最大的 使得 。
然后枚举每一个 ,显然可以 算出最靠后的和它相同的 ,求最大值即可。
复杂度 。
#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;
}

浙公网安备 33010602011771号