/*
前缀和
题意:给定一个01串,求0的个数和1的个数相同的子串最大长度
预处理原来的字符串,1表示1,0表示-1
依次计算处理过的字符串的前缀和,如果某个前缀和以前出现过,
那么会对答案产生影响;如果是第一次出现,记录下这个位置
*/
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
const int maxn=1e5+5;
int n;
char s[maxn];
int a[maxn];
map<int,int>m;//记录前缀和第一次出现的位置
int main()
{
while(~scanf("%d",&n))
{
scanf("%s",s+1);
for(int i=1;i<=n;i++)//预处理
{
if(s[i]=='1')
{
a[i]=1;
}
else
{
a[i]=-1;
}
}
int sum=0,ans=0;
m.clear();
m[0]=1;//初始化
for(int i=1;i<=n;i++)
{
sum+=a[i];//前缀和
if(m[sum])//出现过
{
ans=max(ans,i-m[sum]+1);//出现记录中的前缀和,更新答案
//此时合法长度=当前位置-最初位置
}
else//第一次出现
{
m[sum]=i+1;
}
}
printf("%d\n",ans);
}
return 0;
}
codeforces873B Balanced Substring(前缀和)
最新推荐文章于 2020-10-24 16:51:48 发布