题目: 给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。
一个字符串,只包含01,长度不超过1000000。 输出 一行一个整数,最长的0与1的个数相等的子串的长度。 输入样例 1011 输出样例 2
解法: 用vector记录前缀和,然后遍历求最长长度,注意处理前缀和为负数。 代码:
#include<vector>
using namespace std;
char a[1000010];
vector<int> p[2000010];
int main()
{
scanf("%s",a + 1);
int l = strlen(a + 1);
int sum = 0;
int Max = -999999999;
int Min = 999999999;
p[1000000].push_back(0);
for(int i = 1; i <= l; i++)
{
if(a[i] == '0')
sum++;
else
sum--;
Max = max(sum, Max);
Min = min(sum, Min);
p[sum + 1000000].push_back(i);
}
int ans = 0;
//printf("%d %d\n", Min, Max);
for(int i = Min + 1000000; i <= Max + 1000000; i++)
{
ans = max(p[i][p[i].size() - 1]-p[i][0], ans);
}
printf("%d\n", ans);
}
ps:懒惰又差点战胜了我 加油