1. 程式人生 > >codeforces873B Balanced Substring(字首和)

codeforces873B Balanced Substring(字首和)

/*
字首和
題意:給定一個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; }