原题链接:
题意:
有一个长度为 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;
}