赞
踩
[C. Good Subarrays]
大致翻译:
题目大意:给定已知长度的序列,求区间和等于区间长度的子序列的个数
思路:可以将序列中的每一个数-1,这样当他们满足相加为0的时候便是他们的和等于区间长度的时候
#include <bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define eps 1e-6 typedef long long ll; int main(){ int t; scanf("%d",&t); while(t--){ string a; int n; cin>>n>>a; map<int,int >mp; ll ans=0,sum=0; for(int i=0;i<n;i++){ sum+=a[i]-'0'-1; if(sum==0) ans++; ans+=mp[sum]; mp[sum]++; } printf("%lld\n",ans); } return 0; }
一点解释:
ans+=mp[sum];mp[sum]++;
标记每次sum出现次数,当子序列相加等于前面所出现过的sum时说明后一段子序列相加为0;例如2,3,2,-1,-1;
sum=2+3=5;
sum=2+3+2-1-1=5;
说明2-1-1=0;
满足题目的要求
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。