题目链接: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);
}
//字符串问题哈希是一大利器啊