题意
给n个0或1,求0和1个数相等的字串 和子序列 最长的长度。
字串:连续
子序列:不连续也行
题解
字串:用前缀和,0代表-1, 1代表1, 用map存第一次出现前缀和的位置,如果出现和相等,则说明中间的0,1个数相等
子序列:0和1的个数最小值 * 2;
#include <bits/stdc++.h>
using namespace std;
map<int, int> ma;
int main(){
int n, sum = 0, l = 0, ans = 0;
cin >> n;
string s;
cin >> s;
ma.clear();
ma[0] = -1;
for(int i = 0; i < n; i++){
if(s[i] == '0'){
sum--;
l++; // 0的个数
}
else{
sum++; // 前缀和
}
if(ma.count(sum)){
ans = max(ans, i-ma[sum]);
}
else{
ma[sum] = i; // 第一次出现的位置
}
}
cout << ans << " " << 2*min(l, n-l) << endl;
return 0;
}