给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。
Input
一个字符串,只包含01,长度不超过1000000。
Output
一行一个整数,最长的0与1的个数相等的子串的长度。
Input示例
1011
Output示例
2
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Node
{
int val;
int pos;
Node(int v, int p)
{
val = v;
pos = p;
}
};
bool comp(const Node &left, const Node &right)
{
if (left.val < right.val)
{
return true;
}
else if (left.val == right.val)
{
return left.pos < right.pos;
}
else
{
return false;
}
}
int fun(string &input)
{
int n = input.size();
if (n < 2)
{
return 0;
}
int zeroNum = 0;
vector<Node> buf;
buf.push_back(Node(0, 0));
for (int i = 0; i < n; i++)
{
if (input[i] == '0')
{
zeroNum += 1;
}
buf.push_back(Node(2*zeroNum-i-1, i+1));
}
sort(buf.begin(), buf.end(), comp);
int result = 0;
int curVal = buf[0].val;
int left = 0;
for (int i = 1; i < n+1; i++)
{
if (buf[i].val != buf[i-1].val)
{
int temp = buf[i-1].pos - buf[left].pos;
if (temp > result)
{
result = temp;
}
left = i;
curVal = buf[i].val;
}
}
return result;
}
int main()
{
string input;
cin >> input;
cout << fun(input) << endl;
return 0;
}