牛子挑战赛67b题

数据结构

https://ac.nowcoder.com/acm/contest/51727/B

题目链接: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);
}

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

全部评论
为什么每次cnt[sum]++?好神奇
点赞 回复 分享
发布于 2023-03-19 19:40 辽宁
感谢让我对于哈希的用法更进一步
点赞 回复 分享
发布于 2023-03-18 13:03 江西

相关推荐

评论
6
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务