題解 - CF 873B. Balanced Substring
阿新 • • 發佈:2021-12-09
873B. Balanced Substring
思路
設'1' = '1' , '0' = '-1', 用sum記錄字首和,用pos陣列記錄a陣列中字首和等於k的第一個位置,因為字首和表示1和0的個數差,當sum[a] == sum[b]
, (a,b]中的0和1的個數一定相同。
程式碼
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; //#define for (i, a, b) for (int i = a; i <= b; ++i) const int N = 100004; #define INF 0x3f3f3f3f int n, a[N], pos[2 * N], sum[N], ans; int main() { scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%1d", a + i); //只讀一個字元並將字元作為數字讀入。 memset(pos, INF, sizeof(pos)); pos[N] = 0; // 因為pos[0]在一個都不取時為0,注意這個初始化。 for (int i = 1; i <= n; ++i) { sum[i] = sum[i - 1] + (a[i] ? 1 : -1); //因為運算優先順序,要加括號。 if (pos[sum[i] + N] == INF) pos[sum[i] + N] = i; //記錄初始位置 else ans = max(i - pos[sum[i] + N], ans); } printf("%d\n", ans); for(int i = 1; i <= n; ++i) printf("%d ", sum[i]); return 0; }