小b有一个01序列,她想找到一个最长的区间使得这个区间的01能两两配对,即0的个数和1的个数相等。求最长区间的长度。
收起
思路:将序列中所有0改成-1,然后我们求其前缀和,并找出其第一次出现的位置,因为这个区间两端的前缀和数值没有改变,说明这个区间1和-1的数量是一样多的。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 5e4 + 10; map<int, int> m; int main() { int n, x; scanf("%d", &n); int ans = 0, sum = 0; m[0] = 0; for(int i = 1; i <= n; ++i) { scanf("%d", &x); if(x == 0) x = -1; sum += x; if(m.count(sum)) //如果之前出现过 { ans = max(ans, i - m[sum]); m[sum] = min(m[sum], i); //保证是第一次出现的 } else //没有出现过就记录一下 m[sum] = i; } printf("%d\n", ans); return 0; }
