0%

1393 01相等串

题目:
给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。

一个字符串,只包含01,长度不超过1000000。
输出
一行一个整数,最长的0与1的个数相等的子串的长度。
输入样例
1011
输出样例
2

解法:
用vector记录前缀和,然后遍历求最长长度,注意处理前缀和为负数。
代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#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:懒惰又差点战胜了我 加油