为啥wa了三个点,思路就是记录第一次出现与最后出现位置,用前缀和
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int a[100005];
int sum[100005],maxn,ans;
map<int,int>stat;
map<int,int>last;
int read(){
int x=0,f=1;
char ch = getchar();
while (ch < 48 || ch > 57){
if (ch == 45){
f = -1;
}
ch = getchar();
}
while (ch >= 48 && ch <= 57){
x = (x << 1) + (x << 3) + (ch - 48);
ch = getchar();
}
return x * f;
}
signed main(){
n = read();
for (int i=1; i<=n; i++){
a[i] = read();
if (a[i] == 0) a[i] = -1;
sum[i] = sum[i-1]+a[i];
stat[sum[i]] = 0;
last[sum[i]] = 0;
}
for (int i=1; i<=n; i++){
last[sum[i]] = i;
if (stat[sum[i]] > 0){
continue;
}
else {
stat[sum[i]] = i;
}
}
for (int i=1; i<=n; i++){
if (stat[sum[i]] == last[sum[i]]){
continue;
}
ans = last[sum[i]] - stat[sum[i]];
maxn = max(ans,maxn);
}
cout << maxn;
return 0;
}