题目链接:https://ac.nowcoder.com/acm/contest/51727/B

算法:前缀和+哈希

  一眼n的范围是3e5,而且还有多组数据,所以直接暴力枚举子串肯定是寄,所以我们考虑优化,我们要找符合要求的子串即子串中字符'1','2','0'个数相等,我们不妨将字符'1'等效成1,'2'等效成1,'0'等效成-2,然后做一遍前缀和,当前缀和为0时,就是合法的子串,然后对该合法子串做哈希,每次枚举检查是否合法,加上合法答案即可
code:

void solve(){
    int n;
    string s;
    cin>>n>>s;
    map<pair<int,int>,int>cnt;
    pair<int,int>sum;
    ll res=0;
    cnt[sum]=1;
    sum.xx=0,sum.yy=0;
    for(int i=0;i<n;i++){
        if(s[i]=='0') sum.xx--,sum.yy--;
        if(s[i]=='1') sum.xx++;
        if(s[i]=='2') sum.yy++;
        res+=cnt[sum];
        cnt[sum]++;
    }
    printf("%lld\n",res);
}

//字符串问题哈希是一大利器啊