给定一个01串S,求出它的一个尽可能长的子串S[i..j],满足存在一个位置i<=x<j, S[i..x]中0比1多,而S[x + 1..j]中1比0多。求满足条件的最长子串长度。
Input
一行包含一个只由0和1构成的字符串S。 S的长度不超过1000000。
Output
一行包含一个整数,表示满足要求的最长子串的长度。
Input示例
10
Output示例
0
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
int fun(string &input)
{
int len = input.length();
int value[len];
int h[len];
for (int i = 0; i < len; i++)
{
if (input[i] == '1')
{
value[i] = 1;
}
else
{
value[i] = -1;
}
}
memset(h, -1, sizeof(h));
int sum = 0;
int left[len];
for (int i = 0; i < len; i++)
{
sum += value[i];
if (sum < 0)
{
left[i] = i + 1;
}
else
{
if (h[sum+1] != -1)
{
left[i] = i - h[sum+1];
}
else
{
h[sum] = i;
left[i] = -1;
}
}
}
memset(h, -1, sizeof(h));
int right[len];
sum = 0;
for (int i = len-1; i >= 0; i--)
{
sum -= value[i];
if (sum < 0)
{
right[i] = len - i;
}
else
{
if (h[sum+1] != -1)
{
right[i] = h[sum+1] - i;
}
else
{
h[sum] = i;
right[i] = -1;
}
}
}
int result = 0;
for (int i = 0; i < len-1; i++)
{
if (left[i] > 0 && right[i+1] > 0)
{
int temp = left[i] + right[i+1];
if (temp > result)
{
result = temp;
}
}
}
return result;
}
int main()
{
string a;
cin >> a;
cout << fun(a) << endl;
return 0;
}