CodeForces - 1398C Good Subarrays

CodeForces - 1398C

挺简单的题目,但是没有想到还是整理一下

方法1

把每个元素都减1,那么满足题意的就是一段和的值是0,然后维护前缀和,如果发现这个前缀和之前出现过,就说明有满足题意的部分。就 ans++

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int maxn=4e5+10;
int arr[maxn]={0};
map<int,int>mp;
signed main(){
    int N,n;
    char c;
    cin>>N;
    while(N--){
        cin>>n;
        mp.clear();
        for(int a=1;a<=n;a++){
            cin>>c;
            arr[a]=c-'1';
        }
        int ans=0;int sum=0;
        mp[0]=1;
        for(int a=1;a<=n;a++){
            sum+=arr[a];
            ans+=mp[sum];
            mp[sum]++;
        }
        cout<<ans<<endl;
    }
}

方法2

洛谷题解看到的:

直接移项就能知道要求得的式子了

需要注意初始的时候是p[0]=1

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
int a[100005];
int sum[100005];
map<int,int> p;
signed main(){
    int time;
    cin>>time;
    while(time--){
        int ans=0;
        p.clear();
        int len;
        cin>>len;
        string s;
        cin>>s;
        p[0]=1;
        for(int i=0;i<len;++i){
            int x=s[i]-'0';
            a[i+1]=x;
            sum[i+1]=sum[i]+x;
            p[sum[i+1]-i-1]++;
            if(p[sum[i+1]-i-1]==1)
                continue;
            else{
                ans+=(p[sum[i+1]-i-1]-1);
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
posted @ 2024-08-23 16:09  z-zhi  阅读(3)  评论(0编辑  收藏  举报