这题就是找出来男女相等的最长子数组,其实我们可以这么做,我们把男生不变,女生变成-1,如果区间和是0的话,就是符合要求的连续子数组了
我们可以用前缀和来做,但是如果某个下标的前缀和不是0,我们就要舍弃前面的一些值,我们可以用哈希表记录一下出现过的值,如果恰巧有相等的,相减之后不就是我们要的东西了吗?
我们遍历前缀和,如果前缀和刚好为0,它就是符合要求的,长度就是i,为了简化我们的代码,我们直接把0,0插入到哈希表里面,如果有前缀和为0.就让它减0,刚好是长度
如果是别的数,我们可以找找哈希表出现过这个数没,出现的话还是减去下标,就是我们符合要求的子数组了
#include <iostream>
#include <unordered_map>
using namespace std;
int n;const int N = 1e5+10;
int f[N];
unordered_map<int,int> mp;//第一个记录出现过的值,第二个记录下标
int main()
{cin >> n;mp[0] = 0;int ret = 0;for(int i=1;i<=n;i++){int x;cin>>x;x=x==0 ? -1 : 1;f[i]=f[i-1]+x;if(mp.count(f[i])){ret=max(ret,i-mp[f[i]]);continue;}mp[f[i]]=i;}cout << ret << endl;
}