基准时间限制:1 秒 空间限制:131072 KB 分值: 20
难度:3级算法题
给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。
Input
一个字符串,只包含01,长度不超过1000000。
Output
一行一个整数,最长的0与1的个数相等的子串的长度。
Input示例
1011
Output示例
2
思路:这题我知道肯定跟前缀和有关。。推出一个式子, 2*sum[i]-i = 2*sum[j]-j ,然后根据这个公式做。。结果只过了样例。。。不知道哪里写炸了。。
这题其实把0变成-1就好了啊啊啊啊啊啊啊啊啊啊啊啊.....要想01相等。 就是区间里值为0就好了啊, 要么前缀和相等, 要么前缀和等于0就好了。。。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;
const int maxn = 1e6 + 7;
char s[maxn];
int pre[maxn];
map<int, int> mp;
int main()
{
scanf("%s", s+1);
int len = strlen(s+1);
for(int i = 1; i <= len; i++)
{
if(s[i] == '1')
pre[i] = pre[i-1] + 1;
else
pre[i] = pre[i-1] - 1;
}
int ans = 0;
for(int i = 1; i <= len; i++)
{
if(!pre[i])
ans = i;
if(mp[pre[i]])
ans = max(ans, i-mp[pre[i]]);
if(!mp[pre[i]])
mp[pre[i]] = i;
// cout << pre[i] << ' ' << mp[pre[i]] << endl;
}
printf("%d\n", ans);
return 0;
}