题意:给你一个二进制数组,问你和为K的子串有多少;
解题思路:这个题目和451D有点类似,这里我们只需要知道整个数列的前缀和 为 i 的个数,就可以边DP ,边求出答案。
解题代码:

1 // File Name: 165c.1.cpp 2 // Author: darkdream 3 // Created Time: 2014年07月30日 星期三 10时36分03秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 25 using namespace std; 26 #define LL long long 27 int dp[1000004]; 28 char str[1000005]; 29 int main(){ 30 int n ; 31 scanf("%d",&n); 32 scanf("%s",str); 33 int len = strlen(str); 34 int sum = 0 ; 35 memset(dp,0,sizeof(dp)); 36 dp[0]++; 37 LL ans = 0 ; 38 for(int i = 0 ;i < len ;i ++) 39 { 40 if(str[i] == '1') 41 { 42 sum ++ ; 43 } 44 int nsum = sum - n ; 45 if(nsum >= 0) 46 ans += dp[nsum]; 47 dp[sum]++; 48 } 49 50 printf("%lld ",ans); 51 return 0; 52 }