Educational Codeforces Round 93 (Rated for Div. 2) C. Good Subarrays

C. Good Subarrays

原题链接:https://codeforces.ml/contest/1398/problem/C

题目大意:

给定一个序列,序列中的数为$0,1...9$,求有多少个连续子序列的和等于它的长度。

解题思路:

首先将所有的数都减去1,就可以转化为求有多少个区间和为0,可以维护一个前缀和,当前$i$个数的前缀和等于前$j$个数,则说明$(i,j]$这个区间和为0,所以记录每个前缀和的个数,然后遍历序列即可。要注意的是初始化时$dp_0 = 1$。

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 typedef pair<ll,ll> pi;
 5 typedef complex <double> cp;
 6 #define debug(a) cout<<#a<<":"<<a<<endl;
 7 #define fr freopen("in.txt","r",stdin);
 8 #define Fill(x,a) memset(x,a,sizeof(x))
 9 #define cpy(a,b) memcpy(a,b,sizeof(a))
10 const double PI = acos(-1);
11 const ll INF=0x3f3f3f3f;
12 const ll N=1e6+7;
13 const ll mod=1e9+7;
14 ll maxn,minn;
15 ll T,n,m,q;
16 string s;
17 ll arr[N];
18 map<int,int>mp;
19 
20 
21 int main(){
22     ll ans,res;
23     cin>>T;
24     while(T--){
25         cin>>n>>s;
26         ans=res=0;
27         mp.clear();
28         for(ll i=0;i<n;i++){
29             arr[i+1]=s[i]-'0'-1;    
30         }
31         mp[0]=1;
32         for(ll i=1;i<=n;i++){
33             res+=arr[i];
34             ans=ans+mp[res];
35             mp[res]++;
36         }
37         cout<<ans<<endl;
38         
39     }
40 
41 
42     return 0;
43 }
44  

 

posted @ 2020-08-16 22:12  yya雨  阅读(207)  评论(0编辑  收藏  举报