CF EDU 110 C - Unstable String
阿新 • • 發佈:2022-05-15
C - Unstable String
DP
狀態表示:\(f[i][0/1]\) 為以第 \(i\) 個字元且這個字元為 \(0/1\) 結尾的子串的個數
狀態轉移見程式碼
因為統計的是有多少子串是穩定的,不是統計有多少穩定的字串,所以一個位置上只能取 \(0/1\) 中最長的
所以答案為 \(\sum max(f[i][0],f[i][1])\)
#include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <cmath> using namespace std; typedef long long ll; const int N = 2e5 + 10; const ll INF = 1e18; string s; ll f[N][2]; int main() { ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); int T; cin >> T; while(T--) { cin >> s; int n = s.size(); s = " " + s; ll ans = 0; for (int i = 1; i <= n; i++) { if (s[i] == '0') { f[i][0] = f[i-1][1] + 1; f[i][1] = 0; } else if (s[i] == '1') { f[i][0] = 0; f[i][1] = f[i-1][0] + 1; } else { f[i][0] = f[i-1][1] + 1; f[i][1] = f[i-1][0] + 1; } ans += max(f[i][0], f[i][1]); } cout << ans << endl; } return 0; }