1393 0和1相等串
基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注
给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。
Input
一个字符串,只包含01,长度不超过1000000。
Output
一行一个整数,最长的0与1的个数相等的子串的长度。
Input示例
1011
Output示例
2
题解:当前0的总数 和 当前1的总数只差如果与以前的两者只差相等,就表示这两端之间的一段是0与1是相等的,与抽屉原理的求法相似;
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
#define M 1500010
#define N 500000
#define INF 0x3f3f3f3f
#define LL long long
#define MOD 1000000007
char a[M];//
int s0[M], s1[M], f[M];
int main()
{
int n, ans;
while(scanf("%s", a+1) != EOF)
{
n = strlen(a+1);
ans = 0;
memset(s1, 0, sizeof(s1));
memset(s0, 0, sizeof(s0));
memset(f, -1, sizeof(f));
for(int i=1; i<=n; i++)
{
if(a[i] == '0')
{
s0[i] = s0[i-1] + 1;
s1[i] = s1[i-1];
}
else
{
s1[i] = s1[i-1] + 1;
s0[i] = s0[i-1];
}
if(f[s1[i]-s0[i]+N] == -1)
{
f[s1[i]-s0[i]+N] = i;
}
else
{
ans = max(ans, i-f[s1[i]-s0[i]+N]);
}
if(s1[i] == s0[i])
{
ans = max(ans, i);//这里的要注意,上面的是求中间段的,这个是求从首端开始的
}
}
printf("%d\n", ans);
}
return 0;
}