1、转换成-1和1的字串
计算dp[i],
/*
input:
10101010
output:
8
input:
1101000
output:
6
*/
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
int main()
{
//输入
vector<int> nums;
char x;
while (cin >> x)
{
if (x == '0')
nums.push_back(-1);
else
nums.push_back(1);
}
int n = nums.size();
if (n == 0)
{
cout << 0;
return 0;
}
//
vector<int> dp(n);
dp[0] = nums[0];
for (int i = 1; i < n; i++)
{
dp[i] = dp[i - 1] + nums[i];
}
//
int cnt = 0;
unordered_map<int, pair<int, int>> mp; //
for (int i = 0; i < n; i++)
{
//[0, i]的和为0
if (dp[i] == 0)
{
cnt = max(cnt, i - 0 + 1);
continue;
}
//[0, i]的和不为0,找等值的最长区间长度
if (mp.find(dp[i]) == mp.end())
{
mp.insert({ dp[i], {i, i} });
}
else
{
mp[dp[i]].second = i;
cnt = max(cnt, mp[dp[i]].second - mp[dp[i]].first);
}
}
cout << cnt;
return 0;
}