Points:
300 (p)
Time limit:
1.0s
Memory limit:
256M
Input:
stdin
Output:
stdout
Một xâu gọi là xâu nhị phân nếu chỉ chứa hai ký tự \(0\) hoặc \(1\).
Xâu \(v\) gọi là xâu con của \(w\) nếu xâu \(v\) có độ dài khác 0 và gồm các ký tự liên tiếp trong xâu \(w\).
Ví dụ: xâu \(010\) có các xâu con là: \(0, 1, 0, 01, 10, 010\).
Yêu cầu: Cho trước một giá trị \(k\), hãy đếm xem có bao nhiêu xâu con chứa đúng \(k\) ký tự \(1\).
Input
- Dòng \(1\): chứa một số nguyên \(k (0 \leq k \leq 10^6)\).
- Dòng \(2\): chứa một xâu nhị phân có độ dài \(\leq 10^6\).
Output
- Ghi ra một số nguyên duy nhất là kết quả tìm được.
Scoring
- \(len(s)\) là độ dài xâu nhị phân.
- Subtask \(1\) (\(40\%\) số điểm): \(1 \leq k \leq len(s) \leq 500\).
- Subtask \(2\) (\(30\%\) số điểm): \(1000 \leq k \leq len(s) \leq 10000\).
- Subtask \(3\) (\(30\%\) số điểm): \(10^5 \leq k \leq len(s) \leq 10^6\).
Example
Test 1
Input
2
01010
Output
4
Note
- có 4 xâu con chứa 2 ký tự 1 là: \(101, 0101, 1010, 01010\).
Comments
include<bits/stdc++.h>
using namespace std ;
define ll long long
include<vector>
int main(){
ll k;
cin>>k;
string s;
cin>>s;
vector<ll> v;
if(k==0){
ll ans=0,dem=0;
for(ll i=0;i<s.size();i++){
if(s[i]=='0'){
ans++;
}
if(s[i]=='1'||i==s.size()-1){
dem+=ans*(ans+1)/2;
ans=0;
}
}
cout<<dem;
return 0;
}
}
}
code o(nlogn) cho mọi người tham khảo ạ :V
code: https://ideone.com/bEz2W8
Mọi người cho e hỏi thuật full bài này làm như nào ạ?