codeforces873B Balanced Substring(字首和)
阿新 • • 發佈:2018-11-01
/*
字首和
題意:給定一個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;
}