Crazy Binary String

#include<cstdio>
#include<iostream>
#include<map>
using namespace std;
map<int,int>k;
int max(int x,int y){
    if(x>=y){
        return x;
    }else{
        return y;
    }
}
int min(int x,int y){
    if(x>=y){
        return y;
    }return x;
}
int main(){
    int a=0,b=0;
    int n;
    int maxn=0;
    cin>>n;
    k[0]=0;
    char s;
    for(int i=1;i<=n;i++){
        cin>>s;
        if(s=='1'){
            a++;
        }else{
            b++;
        }
        if(k.find(a-b)==k.end()){ 
            k[a-b]=i;
        }else{
            maxn=max(maxn,i-k[a-b]);
        }
        
    }
    cout<<maxn<<" "<<min(a,b)*2;
    
}

 题目的大体意思就是求一个字符串的子串和子序列中1与0相等的最大值。

对于子序列还比较简单,直接开始的时候判读一个字符串中最小的是1还是0,然后乘2就可。

子串一开始我想用前缀和,但是感觉N*N的复杂度会T,所以发一次map法

这道题是Upc的一道题的简化版..