* time limit per test: **1 seconds** * points per test: **1.0 points** * quantity test: **20 testcase** * memory limit per test: **1024 megabytes** * input : **BBIN.INP** * output : **BBIN.OUT** ## 1. đề bài ## **Câu 4: Xâu nhị phân cân bằng** * Xâu nhị phân cân bằng là một xâu **khác rỗng**, chỉ gồm các chữ số ‘0’ và ‘1’ và số lượng các chữ số ‘0’ bằng số lượng các chữ số ‘1’. Ví dụ: ‘10’, ‘01’, ‘1100’, ‘1001’, ... Một xâu khác rỗng được gọi là một xâu con của một xâu **S** cho trước nếu nó là dãy ký tự liên tục trong **S**. Ví dụ: **S** = ‘101’ thì các xâu ‘1’, ‘10’, ‘01’, ‘101’ là các xâu con của **S**. * **Yêu cầu:** Cho một xâu nhị phân **S**, đếm xem có chứa bao nhiêu xâu con nhị phân cân bằng trong xâu. ## 2. input ## * từ tệp văn bản **BBIN.INP** gồm: * dòng đầu ghi số nguyên dương **n** là độ dài của xâu nhị phân **S**. * dòng thứ hai ghi xâu nhị phân **S**. ## 3.output ## * ghi vào tệp văn bản **BBIN.OUT** gồm một dòng ghi một số là số xâu nhị phân cân bằng của xâu **S**. ## 4. ví dụ ## * **BBIN.INP** ``` 3 101 ``` * **BBIN.OUT** ``` 2 ``` * **BBIN.INP** ``` 8 01101010 ``` * **BBIN.OUT** ``` 13 ``` ## 5. Subtasks ## ``` Subtasks 1 (40%): 0 <= n <= 100 Subtasks 1 (30%): 100 <= n <= 5000 Subtasks 1 (30%): 5000 <= n <= 1000000 ``` ## 6. dạng bài ## * xử lí xâu * tham * cộng dồn ## 7. lời giải sơ lược ## * subtasks 1, 2: duyệt kết hợp cộng dồn tìm đếm các xâu con thỏa mãn, độ phức tạp O(n^2). * subtasks 3: sử dụng kĩ thuật duyệt tịnh tiến cập nhật {0; 1} tại mỗi vị trí, độ phức tạp O(n). ## 8. code mẫu ## ```cpp= #include <bits/stdc++.h> #define fi first #define se second #define all(v) v.begin() , v.end() #define sz(v) (int)v.size() #define unq(v) sort(all(v)); v.resize(unique(all(v)) - v.begin()); using namespace std; typedef long long ll; typedef pair<int , int> ii; typedef pair<long long , int> lli; const int maxN = int(1e6)+7; int n , a[maxN]; string s; namespace sub1{ bool check(){ return n <= 1000; } void solve(){ int ans = 0; for (int i = 1 ; i <= n ; i++){ for (int j = i ; j <= n ; j++){ if (a[j] - a[i - 1] == 0) ans++; } } cout << ans << "\n"; } } namespace sub2{ int cnt[2 * maxN]; void solve(){ ll ans = 0; for (int i = 1 ; i <= n ; i++){ cnt[a[i - 1] + maxN]++; ans += 1ll * cnt[a[i] + maxN]; } cout << ans << "\n"; } } void solve(){ cin >> n >> s; for (int i = 1 ; i <= n ; i++) a[i] = (s[i - 1] == '1') ? +1 : -1 , a[i] += a[i - 1]; if (sub1::check()) return sub1::solve(); return sub2::solve(); } #define name "BBIN" int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); freopen(name".inp" , "r" , stdin); freopen(name".out" , "w" , stdout); int t = 1; //cin >> t; while (t--) solve(); return 0; } ```